カレンダーとタイムゾーン
C++20のカレンダー型を使用します
「カレンダーとタイムゾーン」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
C++20のカレンダー型
C++20では、<chrono>に高度なカレンダー機能が追加されました。整数をやりくりするのではなく、年、月、日を型として直接表現できます。
year、month、day- 完全な日付を表す
year_month_day
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year y{2026};
std::cout << "Year value: " << static_cast<int>(y) << '\n';
return 0;
}カレンダーリテラル
2026yや15dのようなカレンダーリテラルと、std::chrono::Mayなどの名前付きの月を使うと、日付を自然に記述できます。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto y = 2026y;
auto d = 15d;
std::cout << static_cast<int>(y) << " / " << static_cast<unsigned>(d) << '\n';
return 0;
}日付の構築
3つの要素を/演算子で組み合わせると、year_month_dayを作成できます。並び順は年、月、日です。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day ymd = 2026y/May/30;
std::cout << static_cast<int>(ymd.year()) << "-"
<< static_cast<unsigned>(ymd.month()) << "-"
<< static_cast<unsigned>(ymd.day()) << '\n';
return 0;
}日付の検証
year_month_dayは、実在するカレンダー上の日付かどうかを判定できます。ok()を使って、2月30日のような不可能な値を拒否します。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day good = 2026y/February/28;
year_month_day bad = 2026y/February/30;
std::cout << std::boolalpha << good.ok() << " " << bad.ok() << '\n';
return 0;
}sys_days
日付をsys_daysに変換すると、エポックからの日数として扱えます。これにより、日単位の計算や日付間の差分を求められます。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
sys_days a = sys_days{2026y/May/30};
sys_days b = sys_days{2026y/May/20};
std::cout << "Days apart: " << (a - b).count() << '\n';
return 0;
}日単位の計算
sys_daysにdays{n}を加えると、n日先に進みます。その後、カレンダー上の日付に戻すことができます。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
sys_days start = sys_days{2026y/May/30};
sys_days later = start + days{10};
year_month_day ymd = later;
std::cout << static_cast<unsigned>(ymd.day()) << "/"
<< static_cast<unsigned>(ymd.month()) << '\n';
return 0;
}曜日
sys_daysをweekdayに変換すると、その日付が何曜日に当たるかを調べられます。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
weekday wd{sys_days{2026y/May/30}};
std::cout << "Weekday index (Sun=0): " << wd.c_encoding() << '\n';
return 0;
}月の末日
特殊なlast指定子を使うと、うるう年を自動的に処理して、任意の月の最終日を求められます。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day_last eom = 2024y/February/last;
year_month_day ymd = eom;
std::cout << "Feb 2024 ends on day " << static_cast<unsigned>(ymd.day()) << '\n';
return 0;
}うるう年の確認
year型にはis_leap()が用意されているため、割り切れる条件を自分で覚えておく必要はありません。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
std::cout << std::boolalpha;
std::cout << "2024 leap: " << year{2024}.is_leap() << '\n';
std::cout << "2026 leap: " << year{2026}.is_leap() << '\n';
return 0;
}時刻点から日付へ
system_clockの時刻点をdays単位に切り捨て、year_month_dayに変換すると、今日のカレンダー上の日付を取得できます。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto today = floor<days>(system_clock::now());
year_month_day ymd = sys_days{today};
std::cout << "Year is in range: " << (static_cast<int>(ymd.year()) > 2000) << '\n';
return 0;
}タイムゾーン
C++20では、std::chrono::zoned_timeとIANAデータベースによるタイムゾーンも追加されました。利用できるかどうかは標準ライブラリによって異なりますが、この型は時刻点を名前付きのタイムゾーンでラップし、正しい現地時刻を表示できるようにします。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto now = system_clock::now();
auto days_part = floor<days>(now);
std::cout << "Have a UTC time point: " << (days_part.time_since_epoch().count() > 0) << '\n';
return 0;
}クイックチェック
C++20のカレンダー型について理解度を確認します。
まとめ
C++20のカレンダー機能について学びました。
year、month、day、および/で構築するyear_month_dayok()による検証とis_leap()によるうるう年の確認- 日単位の計算と曜日の検索に使う
sys_days - 月末を表す
lastと、zoned_timeの概要
これで「Time and the Chrono Library」コースは完了です。
よくある質問
「カレンダーとタイムゾーン」レッスンは無料ですか?
はい。「カレンダーとタイムゾーン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「カレンダーとタイムゾーン」で何を学びますか?
C++20のカレンダー型を使用します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「カレンダーとタイムゾーン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 継続時間とクロック
- 時点
- コードのパフォーマンス測定
- カレンダーとタイムゾーン