以下是如何使用Howard Hinnant 的日期库 https://howardhinnant.github.io/date/tz.html。这是一个免费的 MIT 许可的 C++11/14 库,基于<chrono>
:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace std::chrono_literals;
using namespace date;
auto unix_timestamp = sys_seconds{1479664467s};
auto zt = make_zoned("America/Los_Angeles", unix_timestamp);
auto wd = weekday{floor<days>(zt.get_local_time())};
std::cout << wd << '\n';
}
第一行仅构造 unix 时间戳(您可能从其他来源获得)。在 C++11 中,我们没有 chrono-literals,因此这一行将是:
auto unix_timestamp = sys_seconds{seconds{1479664467}};
make_zoned()
创建一个zoned_time<seconds>
基于unix_timestamp
和time_zone
“美国/洛杉矶”。 Azoned_time
是一个集合time_zone
和unix时间戳。
您可以从 a 中获取当地时间zoned_time
with zt.get_local_time()
。这是一个chrono::time_point
但没有与之相关的时钟。该时间点的精度将等于原始时间戳的精度(在本例中为秒)。
您可以获得当地星期几local_time
通过截断local_time
精确到days
:
floor<days>(zt.get_local_time())
而这一天——精确time_point
将转换为类型weekday
.
A weekday
可以打印出来,参与weekday
算术和比较,或者显式转换为unsigned
在 [0, 6] 范围内。
上面的程序输出:
Sun
该库的时区部分忠实地代表了IANA 时区数据库 http://www.iana.org/time-zones。它将在本地时区和 UTC 之间进行正确的调整,最早可以追溯到 1800 年代中期至今。如果您传递 1800 年中期之前的库时间戳,则已知最早的 UTC 偏移量将向后推断到 -32768 年。您还可以传递远至 32767 年的时间戳,当前偏移量和夏令时规则将向前传播。
由于这个库是建立在<chrono>
,它将处理任何精度<chrono>
补给品。请注意,一些chrono::duration
比如nanoseconds
范围更有限(+/-292 年nanoseconds
).
库/进程是线程安全的。也就是说,该程序可以直接使用您指定的任何时区,而无需更改计算机的时区或后台环境变量。它还不涉及 C 计时 API 的部分,已知该部分由于非常量函数局部静态而不是线程安全的。
移植到最新版本的 gcc、clang 和 VS。
更新C++20
上面的程序可以轻松移植到 C++20(有些供应商在我编写时支持这一点,有些还没有):
#include <chrono>
#include <iostream>
int
main()
{
using namespace std::chrono;
auto unix_timestamp = sys_seconds{1479664467s};
auto zt = zoned_time{"America/Los_Angeles", unix_timestamp};
auto wd = weekday{floor<days>(zt.get_local_time())};
std::cout << wd << '\n';
}