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