• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class
    <chrono>

    std::chrono::zoned_time

    namespace std::chrono {
      template <class Duration, class TimeZonePtr = const time_zone*>
      class zoned_time;
    
      using zoned_seconds = zoned_time<seconds>;
    }
    

    概要

    zoned_timeは、タイムゾーンを考慮した時間軸上の一点を表す型である。この型は、テンプレートパラメータとして時間間隔をとる。

    秒単位の時間間隔を扱う別名として、zoned_secondsも定義される。

    zoned_timetime_pointtime_zoneの組である。有効なタイムゾーンを常にもち、あいまいなタイムゾーンを参照するようなことにはならないという不変条件をもつ。

    このクラスを介することで、UTCタイムゾーンをもつシステム時間を指定したタイムゾーンのローカル時間に変換でき、またその逆の変換もできる。

    このクラスに対する出力ストリームの演算子は、タイムゾーンを考慮したローカル時間を出力するため、単にタイムゾーンを考慮した日時を出力したい場合にも使用できる。

    適格要件

    • テンプレートパラメータDurationdurationクラスの特殊化であること

    メンバ関数

    構築/コピー/破棄

    名前 説明 対応バージョン
    (constructor) コンストラクタ C++20
    operator= 代入演算子 C++20

    変換

    名前 説明 対応バージョン
    operator sys_time sys_time型への変換演算子 C++20
    operator local_time local_time型への変換演算子 C++20

    観測

    名前 説明 対応バージョン
    get_time_zone タイムゾーンを取得する C++20
    get_local_time ローカル時間を取得する C++20
    get_sys_time システム時間を取得する C++20
    get_info 設定されたタイムゾーンの情報を取得する C++20

    非メンバ関数

    比較演算

    名前 説明 対応バージョン
    operator== 等値比較を行う C++20
    template<class Duration1, class Duration2, class TimeZonePtr>
    bool operator!=(const zoned_time<Duration1, TimeZonePtr>& x, const zoned_time<Duration2, TimeZonePtr>& y);
    非等値比較を行う (==により使用可能) C++20

    入出力

    名前 説明 対応バージョン
    operator<< 出力ストリームに出力する C++20

    推論補助

    名前 説明 対応バージョン
    (deduction_guide) クラステンプレートの推論補助 C++20

    文字列フォーマットサポート

    名前 説明 対応バージョン
    formatter std::formatterクラスの特殊化 C++20
    enable_nonlocking_formatter_optimization std::print()std::println()の効率的な実装を有効にする C++26

    ハッシュサポート

    名前 説明 対応バージョン
    template <class T> struct hash; hashクラスの先行宣言 C++26
    template<class Duration, class TimeZonePtr>
    struct hash<chrono::zoned_time<Duration, TimeZonePtr>>;
    hashクラスのzoned_timeに対する特殊化。hash<Duration>hash<TimeZonePtr>が有効な場合のみ有効 C++26

    基本的な使い方

    #include <iostream>
    #include <chrono>
    
    namespace chrono = std::chrono;
    
    int main()
    {
      // システム時間はUTCタイムゾーンをもつ
      auto now = chrono::system_clock::now();
      chrono::sys_seconds now_sec = chrono::floor<chrono::seconds>(now); // 秒単位
    
      // タイムゾーン情報なしで日時を出力する
      // (ローカルタイムゾーンへの変換はしてくれないので、デフォルトではUTCタイムゾーンで出力される)
      std::cout << "1 : " << now << std::endl;
    
      // タイムゾーン付きで日時を出力する
      std::cout << "2 : " << chrono::zoned_time{now} << std::endl;                   // デフォルトタイムゾーン (UTC)
      std::cout << "3 : " << chrono::zoned_time{"Asia/Tokyo", now} << std::endl;     // 日本 (UTC + 9時間)
      std::cout << "4 : " << chrono::zoned_time{"UTC", now} << std::endl;            // UTC
      std::cout << "5 : " << chrono::zoned_time{"Asia/Tokyo", now_sec} << std::endl; // 日本 (秒単位)
    
      // コンピュータに設定されているタイムゾーンで、日時を出力する
      std::cout << "6 : " << chrono::zoned_time{chrono::current_zone(), now} << std::endl;
    
      // UTCタイムゾーンのシステム時間を、日本のローカル時間に変換
      chrono::local_time lt = chrono::zoned_time{"Asia/Tokyo", now}.get_local_time();
      std::cout << "7 : " << lt << std::endl;
    }
    

    出力例

    1 : 2019-12-20 10:05:05
    2 : 2019-12-20 10:05:05.330140 UTC
    3 : 2019-12-20 19:05:05.330140 JST
    4 : 2019-12-20 10:05:05.330140 UTC
    5 : 2019-12-20 19:05:05 JST
    6 : 2019-12-20 19:05:05.330140 JST
    7 : 2019-12-20 19:05:05
    

    文字列フォーマットの例

    #include <iostream>
    #include <chrono>
    #include <format>
    
    namespace chrono = std::chrono;
    
    int main()
    {
      // システム時間はUTCタイムゾーンをもつ
      auto now = chrono::system_clock::now();
      chrono::sys_seconds now_sec = chrono::floor<chrono::seconds>(now); // 秒単位
    
      chrono::zoned_time zt{"Asia/Tokyo", now};
      chrono::zoned_seconds zt_sec{"Asia/Tokyo", now_sec};
    
      // デフォルトフォーマット
      std::cout << std::format("1 : {}", zt) << std::endl;
      std::cout << std::format("2 : {}", zt_sec) << std::endl;
    
      // 「年月日 時分秒」のフォーマット
      std::cout << std::format("3 : {:%Y年%m月%d日 %H時%M分%S秒}", zt_sec) << std::endl;
    
      // 日付を / (スラッシュ) 区切り、時間を : (コロン) 区切り
      std::cout << std::format("4 : {0:%Y/%m/%d %H:%M:%S}", zt_sec) << std::endl;
    
      // 日付だけ出力
      std::cout << std::format("5 : %Y年%m月%d日", zt_sec) << std::endl;
      std::cout << std::format("6 : %F", zt_sec) << std::endl;
    
      // 時間だけ出力
      std::cout << std::format("7 : %H時%M分%S秒", zt_sec) << std::endl;
      std::cout << std::format("8 : %T", zt_sec) << std::endl;
    
      // 12時間時計で出力
      // (%pでロケール固有の「午前」「午後」を出力するには、日本のロケールを指定する必要がある)
      std::cout << std::format(std::locale("ja_JP.UTF-8"), "9 : %Y年%m月%d日 %p %I時%M分%S秒", zt_sec) << std::endl;
    }
    

    出力例

    1 : 2019-12-20 19:05:05.330140 JST
    2 : 2019-12-20 19:05:05 JST
    3 : 2019年12月20日 19時05分05秒
    4 : 2019/12/20 19:05:05
    5 : 2019年12月20日
    6 : 2019-12-20
    7 : 19時05分05秒
    8 : 19:05:05
    9 : 2019年12月20日 午後 07時05分05秒
    

    バージョン

    言語

    • C++20

    処理系

    参照