0Pricing
C++ Academy · レッスン

カレンダーとタイムゾーン

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_day
  • ok()による検証と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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 継続時間とクロック
  2. 時点
  3. コードのパフォーマンス測定
  4. カレンダーとタイムゾーン
← C++ Academyに戻る