time_zone

time_zone 表示特定地理区域的时区。 它具有每个区域的时区规则的完整历史记录,因此,如果在时区的规则与今天的规则不同的情况下转换一个日期的时间,时间转换会很准确。

语法

class time_zone;  // Since C++20

备注

在时区数据库初始化期间,<chrono> 库会创建 time_zone 对象。 它提供对已创建对象的 const 访问权限。

不能构造或复制 time_zone 对象,使用默认移动构造函数或默认移动赋值运算符会导致未定义的行为。

下面是获取 time_zone 实例的方式:

const auto& timeZoneDatabase = get_tzdb(); // initialize the time zone database
const auto& currentZone = timeZoneDatabase.current_zone();

Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 time_zone 类。 time_zone 类是一项 C++20 功能。 /std:c++latest 编译器选项是必需的。

成员

公共成员函数和函数模板

名称 描述
get_info 获取此 time_zonesys_infolocal_info
name 获取此 time_zone 的名称。
to_local 在此 time_zone 中将 sys_time 转换为 local_time
to_sys 在此 time_zone 中将 local_time 转换为 sys_time

要求

标头<chrono>

时区数据仅适用于 Windows 10 版本 1903/19H1 及更高版本,以及 Windows Server 2022 及更高版本。

命名空间std::chrono

get_info

函数模板 get_info 有两个重载,用于获取此 time_zonesys_infolocal_info

template<class Duration>
sys_info get_info(const sys_time<Duration>& st) const;  // Since C++20
    
template<class Duration>
local_info get_info(const local_time<Duration>& lt) const;  // Since C++20

参数

Duration
sys_timelocal_time 参数的 duration 类。

st
用于获得 sys_info 结果的 sys_time 时间点。

lt
用于获得 local_info 结果的 local_time 时间点。

返回值

在采用 sys_time 时间点 stget_info 函数模板中,它返回一个 sys_info 对象 i,使得 st 在范围 [i.begin, i.end) 内。

在采用 local_time 时间点 ltget_info 函数模板中,它返回一个 local_info 对象。

备注

Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 time_zone::get_info。 该函数是一项 C++20 功能,需要 /std:c++latest 编译器选项。

name

获取此 time_zone 的名称。

string_view name() const noexcept;  // Since C++20

返回值

string_view 形式返回时区名称。

备注

Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 time_zone::name

to_local

函数模板 to_local 在此 time_zone 中将 sys_time 转换为 local_time

template<class Duration>
local_time<common_type_t<Duration, seconds>>
to_local(const sys_time<Duration>& st) const;  // Since C++20

参数

Duration
sys_timelocal_time 参数的 duration 类。

st
用于获得 sys_info 结果的 sys_time 时间点。

返回值

to_local 在此 time_zone 中返回与 st 关联的 local_time

注解

Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 time_zone::to_local。 该函数是一项 C++20 功能,需要 /std:c++latest 编译器选项。

示例:将 sys_time 转换为 local_time

// compile using: /std:c++latest
#include <iostream>
#include <chrono>

using namespace std::chrono;

int main()
{
    const auto& timeZoneDatabase = get_tzdb();
    const auto& currentZone = timeZoneDatabase.current_zone();
    local_time<system_clock::duration> lt = currentZone->to_local(system_clock::now());

    std::cout << "local_time: " << lt << "\n";
   
    return 0;
}
local_time: 2021-09-08 15:15:53.1830646

to_sys

函数模板 to_sys 有两个重载,用于在此 time_zone 中将 local_time 转换为 sys_time

template<class Duration>
sys_time<common_type_t<Duration, seconds>>
to_sys(const local_time<Duration>& lt) const;  // Since C++20

template<class Duration>
sys_time<common_type_t<Duration, seconds>>
to_sys(const local_time<Duration>& lt, choose z) const;  // Since C++20

参数

Duration
local_time 参数的 duration 类。

lt
要转换的 local_time 时间点。

z
choose::earliestchoose::latest 的值。 它用于解析其他不明确的结果。

返回值

to_sys 返回的 sys_time 至少与 seconds 一样精细。 如果自变量 lt 具有更高的精度,它就会更精细。 根据此 time_zone 的规则,返回的 sys_timelt 的 UTC 等效项。

如果从 ltsys_time 的转换不明确,则单参数重载会引发 ambiguous_local_time 异常,如果本地时间点表示不存在的本地时间点,则会引发 nonexistent_local_time 异常。 在夏令时到标准时间的转换期间,可能会出现不明确的情况。 同一本地时间点在一天内可能会出现两个实例。 一个不存在的本地时间点表示从标准时间转换到夏令时的时间点。

在这些情况下,双参数重载不会引发异常。 如果从 ltsys_time 的转换不明确,并且 zchoose::earliest,则 to_sys 返回前面的 sys_time,如果 zchoose::latest,则返回后面的 sys_time。 如果 lt 表示两个 UTC 时间点之间不存在的时间,则这两个 UTC 时间点相同,因此 to_sys 返回该 UTC 时间点。

注解

Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 time_zone::to_sys。 该函数是一项 C++20 功能,需要 /std:c++latest 编译器选项。

示例:将 local_time 转换为 sys_time

// compile using: /std:c++latest
#include <iostream>
#include <chrono>

using namespace std::chrono;

int main()
{
    const auto& timeZoneDatabase = get_tzdb();
    const auto& currentZone = timeZoneDatabase.current_zone();

    auto st = currentZone->to_sys(local_days{2021y/September/15d}+16h+45min, choose::earliest);

    std::cout << "sys_time: " << st << "\n";
   
    return 0;
}
sys_time: 2021-09-15 23:45:00.0000000

另请参阅

<chrono>
头文件引用