Класс 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
Справочник по файлам заголовков