• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <chrono>

    std::chrono::time_zone::to_sys

    template<class Duration>
    sys_time<common_type_t<Duration, seconds>>
      to_sys(const local_time<Duration>& tp) const;           // (1) C++20
    
    template<class Duration>
    sys_time<common_type_t<Duration, seconds>>
      to_sys(const local_time<Duration>& tp, choose z) const; // (2) C++20
    

    概要

    ローカル時間からシステム時間に変換する。

    • (1) : ローカル時間からシステム時間に変換する。あいまいなローカル時間もしくは存在しないローカル時間が指定された場合は例外を送出する
    • (2) : ローカル時間からシステム時間に変換する。あいまいなローカル時間が指定された場合はzで指定された方のシステム時間を返し、存在しないローカル時間が指定された場合は同じ時間点のシステム時間を返す

    戻り値

    • (1) : 少なくとも秒以上の分解能で、タイムゾーンの規則に従ったUTCのシステム時間を返す
    • (2) : (1)に加え、tpからシステム時間への変換があいまいである場合、z == choose::earliestであるなら早い方のシステム時間候補を返し、z == choose::latestであるなら遅い方のシステム時間候補を返す。tpとUTC時間点の間に表現できる時間が存在しない場合、同じ時間点のシステム時間を返す

    例外

    備考

    • 存在しないローカル時間およびあいまいなローカル時間は、サマータイムを採用しているタイムゾーンで生じる可能性がある
      • 存在しないローカル時間の例として、タイムゾーン"America/New_York"のローカル時刻 2016-03-13 02:30:00 は以下の隙間に位置するため存在しえない:
        • 2016-03-13 02:00:00 EST
        • 2016-03-13 03:00:00 EDT
        • 2016-03-13 07:00:00 UTC
      • あいまいなローカル時間の例として、タイムゾーン"America/New_York"のローカル時刻 2016-11-06 01:30:00 は、以下のいずれかとなり、一意に決まらない:
        • 2016-11-06 05:30:00 UTC
        • 2016-11-06 06:30:00 UTC

    #include <iostream>
    #include <cassert>
    #include <chrono>
    
    namespace chrono = std::chrono;
    using namespace std::chrono_literals;
    
    int main()
    {
      auto now = chrono::system_clock::now();
      chrono::local_time local_now{now.time_since_epoch()};
      chrono::local_time local_jst_now = local_now + 9h;
    
      // 日本のローカル時間をシステム時間 (UTCタイムゾーン) に変換する
      const chrono::time_zone* jst = chrono::locate_zone("Asia/Tokyo");
      chrono::sys_time jst_to_utc = jst->to_sys(local_jst_now);
      assert(chrono::floor<chrono::seconds>(jst_to_utc) == chrono::floor<chrono::seconds>(now));
    
      // ニューヨーク (EDTタイムゾーン) のローカル時間を、システム時間 (UTCタイムゾーン) に変換する。
      // ローカル時間2016-11-06 01:30:00 EDTに対応するシステム時間は、以下の2つがあり、一意に決まらない:
      //   2016-11-06 05:30:00 UTC
      //   2016-11-06 06:30:00 UTC
      // ここではlatestを指定することで、遅い時間 (06:30:00) を選択する
      chrono::local_time edt_now = chrono::local_days{2016y/11/6} + 1h + 30min;
      const chrono::time_zone* edt = chrono::locate_zone("America/New_York");
    
      // chooseを指定しない場合、あいまいなローカル時間を与えると例外が送出される
      try {
        edt->to_sys(edt_now);
        assert(false);
      }
      catch (chrono::ambiguous_local_time& e) {
        std::cout << e.what() << std::endl;
      }
    
      // chooseを指定した場合は、早い時間か遅い時間のどちらかを返す。
      // ここではlatestを指定しているため、遅い方の時間を返す
      chrono::sys_time edt_to_utc = edt->to_sys(edt_now, choose::latest);
      std::cout << edt_to_utc << std::endl;
    }
    

    出力例

    (未検証)

    バージョン

    言語

    • C++20

    処理系

    関連項目