我想在任意时间位置(例如America/New_York
)的日期时间和时间戳之间转换
- (时间位置,(年,…,秒)===UTC时间戳
- (UTC时间戳、时间位置)===(年、…、秒、周)
我正在多个线程和不同的时区上进行这些转换。给定线程的时间位置不变,因此我可以存储一些时区结构以供重复使用。
我知道,当夏令时发生变化时(一天中2:30两次或零次),第一次是不明确的。如果报道这样的情况,那将是额外的,但这绝对不是优先事项。
更新:我想要一个跨平台的解决方案。Linux+Windows很好。我所说的任意性是指它来自用户,与处理机的位置无关。
试试这个免费的、开源的、现代的完整IANA时区数据库解析器:
http://howardhinnant.github.io/date/tz.html
它需要C++11或更高版本。它目前要求您下载并维护自己的IANA数据库副本。如果你不想等待操作系统平台更新(你可以像数据库维护人员一样响应),这可能是一件幸事。
这是示例代码:
#include <chrono>
#include <iostream>
#include "date.h"
#include "tz.h"
int
main()
{
using namespace std::chrono_literals;
using namespace date;
// Dave was born April 24, 1954. 10:03 AM pst
// Want to know when he is 2 Gigaseconds old
auto birthday = make_zoned("America/Los_Angeles",
local_days{apr/24/1954} + 10h + 3min);
std::cout << "born : " << birthday << 'n';
birthday = birthday.get_sys_time() + 2'000'000'000s;
std::cout << "2Gs birthday: " << birthday << 'n';
}
这找到Dave的2Gs(吉秒)生日,并输出:
born : 1954-04-24 10:03:00 PST
2Gs birthday: 2017-09-08 14:36:20 PDT
请注意,所有的运算都是在(隐含的)UTC时区内完成的,因此可以正确地计算本地时区("America/Loss_Angeles")的变化。也就是说,生日在太平洋标准时间,2秒后是夏令时:太平洋标准时间。
在gcc-5.2、clang、VS-2015和最近的gcc-4.8上进行了测试。
您可能想看看Google C++时区库:
CCTZ(C++时区)是一个使用时区定义的规则在绝对时间和民用时间之间进行翻译的库(有关这些术语的解释,请参阅下面的基本概念部分)。
该库目前在Linux和Mac OS X上运行,使用安装在系统/usr/share/zoneinfo中的标准IANA时区数据。