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 ❌