Share via


ambiguous_local_time クラス

この例外は、local_timesys_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 あいまいさの性質を説明する文字列を取得します。

必要条件

ヘッダー:<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_timesys_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

関連項目

<chrono>
to_sys
nonexistent_local_time
ヘッダー ファイル リファレンス