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

履歴 編集

function
<chrono>

std::chrono::time_zone::to_sys(C++20)

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時間点の間に表現できる時間が存在しない場合、同じ時間点のシステム時間を返す

例外

  • (1) :
    • tpからシステム時間への変換があいまいである場合、ambiguous_local_time例外を送出する
    • tpとUTC時間点の間に表現できる時間が存在しない場合、nonexistent_local_time例外を送出する

備考

  • 存在しないローカル時間およびあいまいなローカル時間は、サマータイムを採用しているタイムゾーンで生じる可能性がある
    • 存在しないローカル時間の例として、タイムゾーン"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

処理系

  • Clang: (9.0時点で実装なし)
  • GCC: (9.2時点で実装なし)
  • Visual C++: (2019 Update 3時点で実装なし)

関連項目