• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    type-alias
    <chrono>

    std::chrono::時間間隔を表す型

    namespace std {
    namespace chrono {
      using nanoseconds  = duration<少なくても64ビットを持つ符号付き整数型, nano>;        // (1) C++11
      using microseconds = duration<少なくても55ビットを持つ符号付き整数型, micro>;       // (2) C++11
      using milliseconds = duration<少なくても45ビットを持つ符号付き整数型, milli>;       // (3) C++11
      using seconds      = duration<少なくても35ビットを持つ符号付き整数型>;              // (4) C++11
      using minutes      = duration<少なくても29ビットを持つ符号付き整数型, ratio<60>>;   // (5) C++11
      using hours        = duration<少なくても23ビットを持つ符号付き整数型, ratio<3600>>; // (6) C++11
    
      using days         = duration<少なくても25ビットを持つ符号付き整数型,
                                    ratio_multiply<ratio<24>, hours::period>>;            // (7) C++20
      using weeks        = duration<少なくても22ビットを持つ符号付き整数型,
                                    ratio_multiply<ratio<7>, days::period>>;              // (8) C++20
      using years        = duration<少なくても17ビットを持つ符号付き整数型,
                                    ratio_multiply<ratio<146097, 400>, days::period>>;    // (9) C++20
      using months       = duration<少なくても20ビットを持つ符号付き整数型,
                                    ratio_divide<years::period, ratio<12>>>;              // (10) C++20
    }}
    

    概要

    さまざまな日付・時間単位をの時間間隔を表現するduration型の別名。

    • (1) : ナノ秒単位で時間間隔を表現するduration型の別名
    • (2) : マイクロ秒単位で時間間隔を表現するduration型の別名
    • (3) : ミリ秒単位で時間間隔を表現するduration型の別名
    • (4) : 秒単位で時間間隔を表現するduration型の別名
    • (5) : 分単位で時間間隔を表現するduration型の別名
    • (6) : 時単位で時間間隔を表現するduration型の別名
    • (7) : 日単位で時間間隔を表現するduration型の別名
    • (8) : 週単位で時間間隔を表現するduration型の別名
    • (9) : 年単位で時間間隔を表現するduration型の別名
    • (10) : 月単位で時間間隔を表現するduration型の別名

    備考

    • 単位ごとの値を保持する型として「最低でもNビットを持つ符号付き整数型」という定義がされるが、これは標準ライブラリがサポートするすべての時間単位で±292年を最小範囲として表現できることを意図している
      • ナノ秒として64ビット符号付き整数を使用した場合、±292年の範囲を扱える
      • 時としての規定は23ビット以上だが、23ビットの場合に表現できる範囲は±478年となり、1ビットを減らして22ビットにすると表現範囲は±239年となる。22ビットでは目標の±292を下回ってしまう
    • 1ヶ月を表すdurationは年を12で割った値となるため、月は年よりあとに定義される
    • 年は、400年に97回だけうるう年があるため、400年分の日数146097を400で割った平均的な年の日数として定義される

    単位変換を含む基本的な使い方 (C++11)

    #include <iostream>
    #include <chrono>
    
    namespace chrono = std::chrono;
    
    int main()
    {
      chrono::seconds s1{30};
      chrono::seconds s2{20};
    
      // 秒同士の演算
      // 30秒 + 20秒 = 50秒
      chrono::seconds result = s1 + s2;
      std::cout << result.count() << std::endl;
    
      // 秒からミリ秒に変換
      // 50秒 = 50000ミリ秒
      chrono::milliseconds ms = result;
      std::cout << ms.count() << std::endl;
    
      // 秒から分に変換
      // 65秒は1分5秒だが、整数表現の分に変換する際に5秒が切り捨てられるため、
      // 1分となる。
      // 切り捨てが発生する場合には、duration_cast()関数を使用する。
      chrono::seconds s3{65};
      chrono::minutes m = chrono::duration_cast<chrono::minutes>(s3);
      std::cout << m.count() << std::endl;
    }
    

    出力

    50
    50000
    1
    

    日付単位の変換 (C++20)

    #include <cassert>
    #include <chrono>
    
    using namespace std::chrono;
    
    int main()
    {
      // 年から月への変換。duration_castは不要
      months m1 = years{3};
      assert(m1.count() == 36);
    
      // 月から年への変換。duration_castが必要
      months m2{37};
      auto y2 = duration_cast<years>(m2);
      assert(y2.count() == 3);
    
      // 年から日への変換。
      // 400年の平均的な日数として年が定義されるため、日に変換する際に端数が発生する。
      // そのため、duration_castが必要
      days d3 = duration_cast<days>(years{1});
      assert(d3.count() == 365);
    
      // 日から年への変換。端数が発生するため、duration_castが必要
      auto y4 = duration_cast<years>(days{366});
      assert(y4.count() == 1);
    
      // 週から月への変換。端数が発生するため、duration_castが必要
      auto w5 = duration_cast<weeks>(months{1});
      assert(w5.count() == 4);
    
      // 年から週への変換。duration_castが必要
      auto w6 = duration_cast<weeks>(years{1});
      assert(w6.count() == 52);
    }
    

    出力

    バージョン

    言語

    • C++11

    処理系

    関連項目