zoned_time

zoned_timetime_zonetime_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_timelocal_timesys_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_timetime_zone

zt
移动 (std::move(zt)) 到已构造的 zoned_timezoned_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_timetime_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_timetemplate <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_timesys_timelocal_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_pointsys_time

lt
要分配给存储在此 zoned_time 中的 time_pointlocal_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_pointtime_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_timetemplate <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

另请参阅

<chrono>
time_point
time_zone
zoned_traits 结构
头文件引用