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_zone 的 sys_info 或 local_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_zone
的 sys_info
或 local_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_time
或 local_time
参数的 duration
类。
st
用于获得 sys_info
结果的 sys_time
时间点。
lt
用于获得 local_info
结果的 local_time
时间点。
返回值
在采用 sys_time
时间点 st
的 get_info
函数模板中,它返回一个 sys_info
对象 i
,使得 st
在范围 [i.begin, i.end)
内。
在采用 local_time
时间点 lt
的 get_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_time
或 local_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::earliest
或 choose::latest
的值。 它用于解析其他不明确的结果。
返回值
to_sys
返回的 sys_time
至少与 seconds
一样精细。 如果自变量 lt
具有更高的精度,它就会更精细。 根据此 time_zone 的规则,返回的 sys_time
是 lt
的 UTC 等效项。
如果从 lt
到 sys_time
的转换不明确,则单参数重载会引发 ambiguous_local_time
异常,如果本地时间点表示不存在的本地时间点,则会引发 nonexistent_local_time
异常。 在夏令时到标准时间的转换期间,可能会出现不明确的情况。 同一本地时间点在一天内可能会出现两个实例。 一个不存在的本地时间点表示从标准时间转换到夏令时的时间点。
在这些情况下,双参数重载不会引发异常。 如果从 lt
到 sys_time
的转换不明确,并且 z
是 choose::earliest
,则 to_sys
返回前面的 sys_time
,如果 z
是 choose::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