std::chrono::zoned_time
来自cppreference.com
在标头 <chrono> 定义
|
||
template< class Duration, |
(C++20 起) | |
using zoned_seconds = std::chrono::zoned_time<std::chrono::seconds>; |
(C++20 起) | |
类 zoned_time
表示时区与解析是 Duration
的 std::chrono::time_point 的逻辑配对。
zoned_time
的不变量是它始终指代合法的时区并表示该时区中存在且无歧义的时间点。为与此不变量一致, zoned_time
无移动构造函数或移动赋值运算符;试图移动 zoned_time
将进行复制。
如果 Duration
不是 std::chrono::duration 的特化,那么程序非良构。
模板形参 TimeZonePtr
允许用户提供他们自身的时区指针类型并进一步经由 std::chrono::zoned_traits 定制 zoned_time
的行为。定制的时区类型不需要支持 std::chrono::time_zone 所支持的所有操作,只需支持实际在 zoned_time
上调用的函数所用的操作。
TimeZonePtr
必须可移动构造 (MoveConstructible) 。允许仅移动的 TimeZonePtr
,但难以使用,因为 zoned_time
将不可移动且不可能访问存储的 TimeZonePtr
。
成员类型
成员类型 | 定义 |
duration
|
std::common_type_t<Duration, std::chrono::seconds> |
成员函数
构造 zoned_time (公开成员函数) | |
赋值给 zoned_time (公开成员函数) | |
获得时区指针的副本 (公开成员函数) | |
获得作为 local_time 的存储的时间点 (公开成员函数) | |
获得作为 sys_time 的存储的时间点 (公开成员函数) | |
获得关于在存储的时间点的时区的信息 (公开成员函数) |
非成员函数
(C++20) |
比较二个 zoned_time 值 (函数模板) |
(C++20) |
输出 zoned_time 到流中 (函数模板) |
辅助类
std::formatter 的特化,按照提供的格式格式化 zoned_time (类模板特化) | |
std::chrono::zoned_time 的散列支持 (类模板特化) |
推导指引
示例
运行此代码
#include <algorithm> #include <chrono> #include <iomanip> #include <iostream> #include <stdexcept> #include <string_view> int main() { constexpr std::string_view locations[] = { "Africa/Casablanca", "America/Argentina/Buenos_Aires", "America/Barbados", "America/Indiana/Petersburg", "America/Tarasco_Bar", "Antarctica/Casey", "Antarctica/Vostok", "Asia/Magadan", "Asia/Manila", "Asia/Shanghai", "Asia/Tokyo", "Atlantic/Bermuda", "Australia/Darwin", "Europe/Isle_of_Man", "Europe/Laputa", "Indian/Christmas", "Indian/Cocos", "Pacific/Galapagos", }; constexpr auto width = std::ranges::max_element(locations, {}, [](const auto& s){ return s.length(); })->length(); for (const auto location : locations) try { // 'location' 不在时区数据库中的情况下可能会抛出异常 const std::chrono::zoned_time zt{location, std::chrono::system_clock::now()}; std::cout << std::setw(width) << location << " - 时区时间:" << zt << '\n'; } catch (std::runtime_error& ex) { std::cout << "Error: " << ex.what() << '\n'; } }
可能的输出:
Africa/Casablanca - 时区时间:2023-06-29 20:58:34.697449319 +01 America/Argentina/Buenos_Aires - 时区时间:2023-06-29 16:58:34.709957354 -03 America/Barbados - 时区时间:2023-06-29 15:58:34.709977888 AST America/Indiana/Petersburg - 时区时间:2023-06-29 15:58:34.709998072 EDT Error: tzdb: cannot locate zone: America/Tarasco_Bar Antarctica/Casey - 时区时间:2023-06-30 06:58:34.710093685 +11 Antarctica/Vostok - 时区时间:2023-06-30 01:58:34.710107932 +06 Asia/Magadan - 时区时间:2023-06-30 06:58:34.710121831 +11 Asia/Manila - 时区时间:2023-06-30 03:58:34.710134751 PST Asia/Shanghai - 时区时间:2023-06-30 03:58:34.710153259 CST Asia/Tokyo - 时区时间:2023-06-30 04:58:34.710172815 JST Atlantic/Bermuda - 时区时间:2023-06-29 16:58:34.710191043 ADT Australia/Darwin - 时区时间:2023-06-30 05:28:34.710236720 ACST Europe/Isle_of_Man - 时区时间:2023-06-29 20:58:34.710256834 BST Error: tzdb: cannot locate zone: Europe/Laputa Indian/Christmas - 时区时间:2023-06-30 02:58:34.710360409 +07 Indian/Cocos - 时区时间:2023-06-30 02:28:34.710377520 +0630 Pacific/Galapagos - 时区时间:2023-06-29 13:58:34.710389952 -06
参阅
(C++20) |
表示时区 (类) |