zoned_traits 结构

允许将其他默认时区与 zoned_time 相关联,并可选择将自定义名称映射到时区。

语法

1)
template<class T>
struct zoned_traits {}; // C++20

2)
template <>
struct zoned_traits<const time_zone*>; // C++20

参数

1) T - 指向提供自定义 time_zone 的类型的指针。
2) 如果未提供 time_zone* 模板参数,则此专用化将提供 const std::chrono::time_zone*,用于默认为 UTC 时区。

注解

指向所提供类型的指针不必提供静态函数 default_zone()locate_zone()。 但如果未提供,重载解析期间将不会考虑构造函数 zoned_time

成员

名称 描述
default_zone 获取默认时区的 time_zone 指针。
locate_zone 获取指定时区的 time_zone 指针。

要求

标头<chrono>

命名空间std::chrono

编译器选项: /std:c++latest

Microsoft C++ 从 Visual Studio 2019 版本 16.10 开始支持 zoned_traits 类。

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

default_zone

获取默认时区的 time_zone。 有关此操作工作原理的详细信息,请参阅本主题末尾的代码示例

static const time_zone* default_zone();

返回值

如果未提供模板参数,则模板专用化会提供 zoned_traits<const time_zone*>,拥有返回 UTC 时区。 否则,它将返回模板参数 T提供的默认时区。

locate_zone

返回指定时区的 time_zone 指针。 有关此操作工作原理的详细信息,请参阅本主题末尾的代码示例

static const time_zone* locate_zone(string_view name);

模板参数

name
要查找的时区的名称。 例如 "UTC"

返回值

如果构造了一个 zoned_traits 而未提供自定义时区指针的模板参数,则返回值为 std::chrono::locate_zone(name)。 否则,它将返回模板参数 T 中定义的值 locate_zone()

示例: zoned_traits

以下示例演示如何使用 zoned_traits 提供自定义默认时区。

首先,定义 CustomTimeZonePtr,它通过 operator->() 提供指向自定义时区类型的指针。

然后,声明 zoned_traits,在其中定义 default_zone 以返回自定义默认时区。 以南极为例。

在此示例中,zoned_traits<CustomTimeZonePtr>::locate_zone() 将指定的时区名称传递给 std::chrono::locate_zone()。 使用此函数,可将自定义时区名称映射到另一个时区。

最后,定义使用标准 time_zone 指针的 stdZT,由于它不提供模板参数,因此使用提供 const std::chrono::time_zone* 的专用化。

运行此示例以查看 zoned_time 使用自定义,然后运行标准 time_zone 指针。

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

using namespace std::chrono;

struct CustomTimeZonePtr
{
    CustomTimeZonePtr() {}
    CustomTimeZonePtr(const time_zone* tz) : tzptr(tz) {}

    const time_zone* operator->() const
    {
        return tzptr;
    }

private:
    const time_zone* tzptr;
};

template <>
struct zoned_traits<CustomTimeZonePtr>
{
    static const CustomTimeZonePtr default_zone()
    {
        return CustomTimeZonePtr{ locate_zone("Antarctica/South_Pole") };
    }

    static const CustomTimeZonePtr locate_zone(std::string_view name)
    {
        // Here you can provide your own mapping between the name
        // parameter and another time zone before passing it to locate_zone()
        return CustomTimeZonePtr{ std::chrono::locate_zone(name) };
    }
};

int main()
{
    std::cout << "-- Custom time zone pointer with specialized zoned_traits and different default zone behavior --\n";
    zoned_time<seconds, CustomTimeZonePtr> myZT;
    std::cout << myZT.get_info() << "\n";

    std::cout << "-- Built-in time zone pointer with standard zoned_traits --\n";
    zoned_time<seconds, const time_zone*> stdZT;
    std::cout << stdZT.get_info() << "\n";

    return 0;
}
-- Custom time zone pointer with specialized zoned_traits and different default zone behavior --
begin: 1945-12-31 12:00:00, end: 1974-11-02 14:00:00, offset: 43200s, save: 0min, abbrev: GMT+12
-- Built-in time zone pointer with standard zoned_traits --
begin: -32767-01-01 00:00:00, end: 32767-12-31 23:59:59, offset: 0s, save: 0min, abbrev: UTC

另请参阅

<chrono>
time_zone
zoned_time
头文件引用