Joh*_*man 9 c++ datetime-conversion
如何根据任意Unix时间戳(秒)确定加利福尼亚州(太平洋时间)的星期几?我搜索过,但还没有找到C++的内置库.
UTC通常比PT提前8小时,但简单地从Unix时间戳减去8小时并且创建tm结构不起作用,因为这可以减少夏令时的细微差别.
以下是使用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_timestamp和time_zone"America/Los_Angeles".A zoned_time是a time_zone和unix时间戳的集合.
你可以得到本地时间走出了一条zoned_time用zt.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::duration的nanoseconds范围更为有限(+/- 292年nanoseconds).
库/进程是线程安全的.也就是说,程序可以直接使用您指定的任何时区,而无需更改计算机的时区或环境变量.它也不涉及C时序API的一部分,由于非const函数局部静态,已知它不是线程安全的.
移植到最新版本的gcc,clang和VS.