Поделиться через


Класс ambiguous_local_time

Это исключение возникает при попытке преобразования в объект local_time sys_time и результат может быть одним из двух раз, и ни один из них не choose::latest choose::earliest был указан для урегулирования неоднозначности.

Синтаксис

class ambiguous_local_time : public runtime_error; // C++20

Замечания

Во время перехода с летнего времени на стандартное время осенью часы по сути получают дополнительный час. Это может быть запутано, потому что не переход на стандартное время означает потерю часа? Попадая обратно в час, час до перехода будет повторяться после того, как часы корректируются на стандартное время. Рассмотрим изменение стандартного времени в Нью-йорке, которое происходит в первое воскресенье в ноябре в 2:00 утра. Во-первых, 1:00 утра идет. В 2 утра часы переходит в стандартное время, поэтому теперь это 1:00 утра снова. Это означает, что время между 1 утра и 2 утра будет "повторяться", эффективно добавляя час.

Если значение local_time указывает время в течение этого дополнительного часа, это не ясно, как преобразовать его. Следует ли рассматривать преобразованное время как "первое" время, которое происходит час, или "второй"? Если перечисление 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_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

См. также

<chrono>
to_sys
nonexistent_local_time
Справочник по файлам заголовков