std::chrono::zoned_time<Duration,TimeZonePtr>::zoned_time
来自cppreference.com
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
| |
(3) | (C++20 起) |
| |
(4) | (C++20 起) |
| |
(5) | (C++20 起) |
| |
(6) | (C++20 起) |
| |
(7) | (C++20 起) |
| |
(8) | (C++20 起) |
| |
(9) | (C++20 起) |
| |
(10) | (C++20 起) |
| |
(11) | (C++20 起) |
| |
(12) | (C++20 起) |
| |
(13) | (C++20 起) |
| |
(14) | (C++20 起) |
| |
(15) | (C++20 起) |
| |
(16) | (C++20 起) |
构造 zoned_time 对象,按照下表初始化存储的时区指针和时间点,其中 traits 为 std::chrono::zoned_traits<TimeZonePtr>:
| 重载 | 时区指针(记为 zone)
|
时间点(std::chrono::sys_time<duration>)
|
注解 |
|---|---|---|---|
| (1) | traits::default_zone()
|
默认构造 | (a) |
| (2) | st
| ||
| (3) | other.get_time_zone()
|
other.get_sys_time()
|
(b) |
| (4) | other.get_time_zone()
|
other.get_sys_time()
|
(e) |
| (5) | std::move(z)
|
默认构造 | |
| (6) | traits::locate_zone(name)
|
(c) | |
| (7) | std::move(z)
|
st
|
|
| (8) | traits::locate_zone(name)
|
(c) | |
| (9) | std::move(z)
|
zone->to_sys(tp)
|
(d) |
| (10) | traits::locate_zone(name)
|
(c,d) | |
| (11) | std::move(z)
|
zone->to_sys(tp, c)
|
(d) |
| (12) | traits::locate_zone(name)
|
(c,d) | |
| (13,14) | std::move(z)
|
zt.get_sys_time()
|
(e) |
| (15,16) | traits::locate_zone(name)
|
(c,e) |
a) 若
traits::default_zone() 非良构,则指定来调用该表达式的构造函数 (1,2) 不参与重载决议。b) 若
std::is_copy_constructible_v<TimeZonePtr> 为 false 则预置的复制构造函数 (3) 被定义为弃置。c) 若
traits::locate_zone(name) 非良构或若该表达式不可转换成 TimeZonePtr,则带 std::string_view 形参 name 的构造函数 (6,8,10,12,15-16) 不参与重载决议。d) 若
zone->to_sys 非良构或其结果不可转换成 std::chrono::sys_time<duration>,则指定来调用该调用表达式的构造函数 (9-12) 不参与重载决议。e) 若
Duration2 不可转换成 Duration,则带模板形参 Duration2 的构造函数 (4,13-16) 不参与重载决议。若(按上述方式初始化的)时区指针不指代合法时区,则行为未定义。
注解
zoned_time 无移动构造函数,而移动它的尝试将代之以用预置的复制构造函数 (3) 进行复制。从而当 TimeZonePtr 是仅移动的类型时,zoned_time 不可移动:既不能复制亦不能移动它。
构造函数 (14,16) 接受 std::chrono::choose 形参,但该形参无效果。
Example
运行此代码
#include <chrono>
#include <iostream>
#include <string_view>
int main()
{
using std::chrono_literals::operator""y;
using std::operator""sv;
std::cout << std::chrono::zoned_time{} << " : default\n";
constexpr std::string_view location1{"America/Phoenix"sv};
std::cout << std::chrono::zoned_time{location1} << " : " << location1 << '\n';
const std::chrono::time_zone* timeZonePtr = std::chrono::locate_zone("UTC");
std::cout << std::chrono::zoned_time{timeZonePtr} << " : UTC time zone\n";
constexpr auto location2{"Europe/Rome"sv};
std::cout << std::chrono::zoned_time{location2, std::chrono::local_days{2021y/12/31}}
<< " : " << location2 << '\n';
constexpr auto location3{"Europe/Rome"sv};
constexpr auto some_date = std::chrono::sys_time<std::chrono::days>{2021y/12/31};
std::cout << std::chrono::zoned_time{location3, some_date}
<< " : " << location3 << '\n';
const auto now =
std::chrono::floor<std::chrono::minutes>(std::chrono::system_clock::now());
constexpr auto location4{"Europe/Rome"sv};
std::cout << std::chrono::zoned_time{location4, now} << " : " << location4 << '\n';
constexpr auto NewYork{"America/New_York"sv};
constexpr auto Tokyo{"Asia/Tokyo"sv};
const std::chrono::zoned_time tz_Tokyo{Tokyo, now};
const std::chrono::zoned_time tz_NewYork{NewYork, now};
std::cout << std::chrono::zoned_time{Tokyo, tz_NewYork} << " : " << Tokyo << '\n';
std::cout << std::chrono::zoned_time{NewYork, tz_Tokyo} << " : " << NewYork << '\n';
}
可能的输出:
1970-01-01 00:00:00 UTC : default
1969-12-31 17:00:00 MST : America/Phoenix
1970-01-01 00:00:00 UTC : UTC time zone
2021-12-31 00:00:00 CET : Europe/Rome
2021-12-31 01:00:00 CET : Europe/Rome
2021-09-20 23:04:00 CEST : Europe/Rome
2021-09-21 06:04:00 JST : Asia/Tokyo
2021-09-20 17:04:00 EDT : America/New_York