ambiguous_local_time
类
尝试将 local_time
转换为 sys_time
时,将引发此异常,结果可能是两个时间之一,并未指定 choose::earliest
或 choose::latest
以解决不明确性。
语法
class ambiguous_local_time : public runtime_error; // C++20
备注
在秋季从夏令时转换到标准时间期间,时钟实质上会获得额外的一小时。 这可能令人困惑,因为转换到标准时间不是意味着失去了一小时吗? 通过回退一小时,在时钟调整为标准时间后,将重复转换前的一小时。 考虑纽约标准时间的变更,该变更发生在 11 月的第一个星期天凌晨 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