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

Joh*_*man 9 c++ datetime-conversion

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

UTC通常比PT提前8小时,但简单地从Unix时间戳减去8小时并且创建tm结构不起作用,因为这可以减少夏令时的细微差别.

How*_*ant 9

以下是使用Howard Hinnant的日期库的方法.这是一个免费的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';
}
Run Code Online (Sandbox Code Playgroud)

第一行只构造unix时间戳(您可以从其他源获取).在C++ 11中,我们没有chrono-literals,因此这行代替:

auto unix_timestamp = sys_seconds{seconds{1479664467}};
Run Code Online (Sandbox Code Playgroud)

make_zoned()创建一个zoned_time<seconds>基于unix_timestamptime_zone"America/Los_Angeles".A zoned_time是a time_zone和unix时间戳的集合.

你可以得到本地时间走出了一条zoned_timezt.get_local_time().这是一个chrono::time_point但没有与之相关的时钟.此时间点的精度将等于原始时间戳的精度(在这种情况下为秒).

您可以local_time通过截断local_time精度来获得一周中的当地日期days:

floor<days>(zt.get_local_time())
Run Code Online (Sandbox Code Playgroud)

而这一天的精度time_point将转换为类型weekday.

A weekday可以打印出来,参与weekday算术和比较,或者显式转换为unsigned[0,6]范围内的a.

上述程序输出:

Sun
Run Code Online (Sandbox Code Playgroud)

此库的时区部分是IANA时区数据库的忠实代表.它将在当地时区和UTC之间进行正确的调整,直到1800年代中期到现在.如果您在1800年代中期之前传递库时间戳,则最早的已知UTC偏移量会向后推断到-32768年.您还可以将未来的时间戳传递给32767年,并且当前的偏移和夏令时规则将向前传播.

由于这个库是基于<chrono>它的,它将处理任何提供的精度<chrono>.请注意,某些内容chrono::durationnanoseconds范围更为有限(+/- 292年nanoseconds).

库/进程是线程安全的.也就是说,程序可以直接使用您指定的任何时区,而无需更改计算机的时区或环境变量.它也不涉及C时序API的一部分,由于非const函数局部静态,已知它不是线程安全的.

移植到最新版本的gcc,clang和VS.