ambiguous_local_time

尝试将 local_time 转换为 sys_time 时,将引发此异常,结果可能是两个时间之一,并未指定 choose::earliestchoose::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

另请参阅

<chrono>
to_sys
nonexistent_local_time
头文件引用