在 C++ 中将 unix 时间戳转换为星期几?

2024-04-30

如何根据任意 Unix 时间戳(秒)确定加利福尼亚州的星期几(太平洋时间)?我四处搜寻,但没有找到 C++ 的内置库。

UTC 通常比 PT 早 8 小时,但只需从 Unix 时间戳中减去 8 小时并创建一个tmstruct 不起作用,因为这会折扣夏令时的细微差别。


以下是如何使用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_timestamptime_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';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中将 unix 时间戳转换为星期几? 的相关文章

随机推荐