ambiguous_local_time
クラス
この例外は、local_time
を sys_time
に変換しようとしたときに、結果が 2 つの時刻のうちのいずれかになる可能性があり、あいまいさを解消するための choose::earliest
または choose::latest
が指定されていなかった場合にスローされます。
構文
class ambiguous_local_time : public runtime_error; // C++20
解説
秋の夏時間から標準時への移行中に、時計は基本的に 1 時間余分に進みます。 これは、標準時への移行によって 1 時間が失われるように思われるため、混乱を招く可能性があります。 1 時間戻すことにより、移行前の時間は、時計が標準時に調整された後に繰り返されます。 ニューヨークでの標準時への変更について考えてみましょう。これは 11 月の最初の日曜日の午前 2 時に発生します。 まず、午前 1 時が過ぎます。 午前 2 時に時計は標準時に移行するため、もう一度午前 1 時になります。 つまり、午前 1 時から午前 2 時までの時間は繰り返され、事実上 1 時間が加算されます。
local_time
がこの "追加分の" 1 時間の時間を指定した場合、変換方法は明確ではありません。 変換された時刻を、1 回目に発生した "最初の" 時間または "2 回目" の時間のどちらとして扱う必要があるでしょうか。 どちらにすべきかを指定する列挙型 choose
が指定されていない場合は、ambiguous_local_time
例外が発生します。
この問題は、標準時から夏時間への変換時には存在しません。 その場合は、別の問題が発生する可能性があります。 詳細については、nonexistent_local_time
を参照してください。
次の例は、あいまいな変換を示しています。
例: ambiguous_local_time
#include <chrono>
#include <iostream>
using namespace std::chrono;
int main()
{
try
{
// The following will throw an exception because converting 1:30am local time to system time could be interpreted as either
// 1:30 AM EDT or 1:30 AM EST. Which to choose isn't specified for the conversion, so an ambiguous_local_time
// exception is thrown.
auto zt = zoned_time{"America/New_York", local_days{Sunday[1]/November/2016} + 1h + 30min};
} catch (const ambiguous_local_time& e)
{
std::cout << e.what() << '\n';
}
return 0;
}
2016-11-06 01:30:00 is ambiguous. It could be
2016-11-06 01:30:00 EDT == 2016-11-06 05:30:00 UTC or
2016-11-06 01:30:00 EST == 2016-11-06 06:30:00 UTC
メンバー
名前 | 説明 |
---|---|
コンストラクター | ambiguous_local_time を構築します。 |
what |
あいまいさの性質を説明する文字列を取得します。 |
要件
Header: <chrono>
(C++20 以降)
名前空間: std::chrono
コンパイラ オプション: /std:c++latest
コンストラクター
ambiguous_local_time
を構築します。
template<class Duration>
ambiguous_local_time(const local_time<Duration>& tp, const local_info& i);
パラメーター
tp
変換できなかった local_time
。
i
試行された変換に関する情報。 詳細については、local_info
を参照してください。
解説
通常、この例外は作成されません。 これは、local_time
を sys_time
に変換する関数によってスローされます。
what
あいまいさの詳細を説明する文字列を取得します。
[[nodiscard]] virtual const char* what() const noexcept;
戻り値
あいまいさを説明する文字列。 次に例を示します。
2016-11-06 01:30:00 is ambiguous. It could be
2016-11-06 01:30:00 EDT == 2016-11-06 05:30:00 UTC or
2016-11-06 01:30:00 EST == 2016-11-06 06:30:00 UTC