zoned_time
类
zoned_time
是 time_zone
和 time_point
组成的一对。 它在特定时区内是指 time_point
含义。
语法
template<class Duration, class TimeZonePtr = const time_zone*>
class zoned_time ; // C++20
备注
zoned_time
始终引用有效的时区,并表示在该时区中存在且确定的时间点。
成员
名称 | 说明 |
---|---|
构造函数 | 构造 zoned_time 。 |
get_info |
使用此 zoned_time 中的时区获取有关 zoned_time 中时间点的信息。 |
get_local_time |
将 zoned_time 中的时区与存储的时间点组合起来,以生成该时区中的本地时间。 |
get_sys_time |
获取存储在此 zoned_time 中的时间点,但不应用时区。 |
get_time_zone |
获取存储在此 中的 time_zonezoned_time 。 |
operator= |
将另一个 zoned_time 或另一个 zoned_time 的 local_time 或 sys_time 的值分配给此 zoned_time 。 |
operator local_time |
将 zoned_time 的时区与存储的时间点组合起来,以生成该时区中的本地时间。 |
operator sys_time |
获取存储在此 zoned_time 中的时间,但不应用时区。 |
非成员
“属性” | 说明 |
---|---|
operator== |
确定两个 zoned_time 实例是否相等。 |
operator<< |
将 zoned_time 输出到给定流。 |
便利类型别名
名称 | 描述 |
---|---|
zoned_seconds |
zoned_time<seconds>; 的同义词 |
zoned_time::duration |
持续时间(以秒为单位)。 它是 common_type_t<Duration, seconds>; 的同义词 |
要求
标头:<chrono>
Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 zoned_time
类。
时区数据仅适用于 Windows 10 版本 1903/19H1 及更高版本,以及 Windows Server 2022 及更高版本。
命名空间:std::chrono
编译器选项: /std:c++latest
构造函数
构造 zoned_time
。
1) zoned_time();
2) zoned_time(const zoned_time& zt) = default;
3) explicit zoned_time(TimeZonePtr z);
4) zoned_time(const sys_time<Duration>& st);
5) explicit zoned_time(string_view name);
6) zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
7) zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
8) zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
9) zoned_time(string_view name, const local_time<Duration>& tp);
10) zoned_time(string_view name, const local_time<Duration>& tp, choose c);
11) zoned_time(string_view name, const sys_time<Duration>& st);
12) template<class Duration, class TimeZonePtr> zoned_time(string_view name, const zoned_time<Duration>& y);
13) template<class Duration, class TimeZonePtr> zoned_time(string_view name, const zoned_time<Duration>& y, choose c);
14) template<class Duration> zoned_time(const zoned_time<Duration, TimeZonePtr>& y);
15) template<class Duration, class TimeZonePtr> zoned_time(TimeZonePtr z, const zoned_time<Duration, TimeZonePtr>& y);
16) template<class Duration, class TimeZonePtr> zoned_time(TimeZonePtr z, const zoned_time<Duration, TimeZonePtr>& y, choose);
参数
c
指示在将 local_time
转换为 sys_time
时如何处理不明确或不存在的本地时间。 有关详细信息,请参阅 choose
枚举。
name
时区的名称。
st
具有指定持续时间的 sys_time
。 用于设置时间。
tp
具有指定持续时间的 local_time
。 用于设置时间。
y
复制 zoned_time
以构造新的 zoned_time
。
z
移动 (std::move(z)
) 到已构造的 zoned_time
的 time_zone
。
zt
移动 (std::move(zt)
) 到已构造的 zoned_time
的 zoned_time
指针。
备注
1)使用 traits::default_zone()
初始化时区,并默认构造时间点。
2)默认复制构造函数。
3)使用 std::move(z)
初始化时区,并默认构造时间点。
4)使用 traits::default_zone()
初始化时区,并用 st
初始化时间。
5)使用 traits::locate_zone(name)
初始化时区,并默认构造时间点。
6)使用 std::move(z)
初始化时区,并通过将 tp
转换为 z->to_sys(tp)
来初始化时间。
7)使用 std::move(z)
初始化时区,并用 z->to_sys(tp, c)
初始化时间。 请参阅 choose
枚举,了解参数 c
如何影响结果。
8)使用 std::move(z)
初始化时区,并用 st
初始化时间。
9)等同于使用 {traits::locate_zone(name), tp}
构造。
10)等同于使用 {traits::locate_zone(name), tp, c}
构造。
11)等同于使用 {traits::locate_zone(name), st}
构造。
12)等同于使用 {traits::locate_zone(name), y}
构造。
13)等同于使用 {traits::locate_zone(name), y, c}
构造。 choose
参数 c
无影响。
14)从 y
的时区和时间点初始化时区。
15)使用 std::move(z)
初始化时区,并从 y
的时间点初始化时间。
16)等同于使用 {z, y}
构造。 choose
参数 c
无影响。
注意
zoned_time
没有移动构造函数。 尝试移动它会导致使用默认复制构造函数生成副本。
示例:构造 zoned_time
下面演示如何在 2021 年 9 月 15 日下午 4:45 为时区 "Antarctica/Casey"
创建 zoned_time
实例:
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Antarctica/Casey", sys_days{2021y/September/15d}+16h+45min);
std::cout << zt;
return 0;
}
2021-09-16 03:45:00 GMT+11
get_info
使用此 zoned_time
中的时区获取有关 zoned_time
中时间点的信息。
sys_info get_info() const;
返回值
一个 sys_info
,包含时区和时间的 UTC 时差、夏令时调整时差等。
示例: get_info
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Antarctica/Casey", sys_days{2021y/September/15d}+16h+45min);
sys_info si = zt.get_info();
std::cout << si;
return 0;
}
begin: 2020-10-03 16:01:00, end: 32767-12-31 23:59:59, offset: 39600s, save: 0min, abbrev: GMT+11
get_local_time
获取一个 local_time<duration>
,它表示给定此 zoned_time
的时区和时间点的本地时间。
local_time<duration> get_local_time() const;
返回值
返回的 local_time
是 time_point<local_t, duration>
的同义词。
示例: get_local_time
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Antarctica/Casey", sys_days{2021y/September/15d}+16h+45min);
std::cout << zt.get_info();
return 0;
}
2021-09-16 03:45:00
get_sys_time
获取存储在 zoned_time
中的 system_clock
的时间。
sys_time<duration> get_sys_time() const;
返回值
存储于此 zoned_time
中的时间,没有对时区进行任何调整。 它表示系统范围的挂钟时间为 time_point。 返回的 sys_time
是 template <class Duration> time_point<system_clock Duration>;
的同义词
示例: get_sys_time
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Antarctica/Casey", sys_days{2021y/September/15d}+16h+45min);
std::cout << zt.get_sys_time();
return 0;
}
2021-09-15 16:45:00
get_time_zone
获取存储在此 zoned_time
中的时区。
TimeZonePtr get_time_zone() const;
返回值
指向存储在 zoned_time
中的 time_zone 的指针。
示例: get_time_zone
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Antarctica/Casey", sys_days{2021y/September/15d}+16h+45min);
auto pTZ = zt.get_time_zone();
std::cout << pTZ->name();
return 0;
}
Antarctica/Casey
operator=
将另一个 zoned_time
分配给这一个 (this
)。 或者仅分配另一个 zoned_time
的 sys_time
或 local_time
。
1) zoned_time& operator=(const zoned_time& zt) = default;
2) zoned_time& operator=(const sys_time<Duration>& st);
3) zoned_time& operator=(const local_time<Duration>& lt);
参数
zt
要分配给这一个 (this
) 的 zoned_time
。
st
要分配给存储在此 zoned_time
中的 time_point
的 sys_time
。
lt
要分配给存储在此 zoned_time
中的 time_point
的 local_time
。
返回值
*this
示例: operator=
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt1{}, zt2("Pacific/Galapagos", sys_days{2021y/September/15d} + 16h + 45min);
std::cout << zt2.get_local_time() << "\n";
zt1 = zt2.get_local_time();
std::cout << zt1.get_local_time();
return 0;
}
2021-09-15 10:45:00
2021-09-15 10:45:00
备注
1)默认复制赋值运算符。 将存储的 time_point
和 time_zone 指针从另一个 zoned_time
复制(不移动)到这一个 zoned_time
。
2)将 st
分配到此 zoned_time
中的 time_point
。 分配后,*this->get_sys_time() == st;
3)将 lt
(local_time
) 转换为sys_time
。 它以 timeZone->to_sys(lt)
的形式进行操作,并将结果分配给 zoned_time
中的 [time_point
]。 分配后,*this->get_local_time() == lt;
operator local_time
将 zoned_time
的时区与存储的时间点组合起来,以生成该时区中的本地时间。
explicit operator local_time<duration>() const;
返回值
一个 time_point<local_t, Duration>
,表示此 zoned_time
中的时间和时区的本地时间。 可以使用方便的别名 local_time
来表示此函数返回的值。
返回值实际为 timeZone->to_local(get_sys_time());
示例: operator local_time
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Pacific/Galapagos", sys_days{ 2021y / September / 15d } + 16h + 45min);
std::cout << (local_time<seconds>)zt;
return 0;
}
2021-09-15 10:45:00
operator sys_time
获取存储在此 zoned_time
中的时间点,但不应用时区。
operator sys_time<duration>() const;
返回值
存储于此 zoned_time
中的时间,没有对时区进行任何调整。 返回的 sys_time
是 template <class Duration> time_point<system_clock Duration>;
的同义词,表示存储在此 zoned_time
中的同一时间点。
示例: operator sys_time
// compile using: /std:c++latest
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main()
{
zoned_time zt("Pacific/Galapagos", sys_days{2021y/September/15d} + 16h + 45min);
std::cout << (sys_time<seconds>)zt;
return 0;
}
2021-09-15 16:45:00