我想在任意时间位置(例如 America/New_York
)在日期时间和时间戳之间进行转换
- (时间位置, (year, ..., sec)) ==> UTC 时间戳
- (UTC 时间戳,时间位置)==>(年,...,秒,星期几)
我正在对多个线程和不同时区进行这些转换。给定线程的时间位置不会改变,因此我可以存储一些时区结构以供重复使用。
我知道当 DST 更改发生时(2:30 一天两次或零次),第一个是模棱两可的。如果报告这种情况,那将是额外的,但这绝对不是优先事项。
更新:我想要一个跨平台的解决方案。 Linux + Windows 没问题。我所说的任意是指它来自用户,与处理机器的位置无关。
最佳答案
试试这个完整的 IANA 时区数据库的免费、开源、现代解析器:
http://howardhinnant.github.io/date/tz.html
它需要 C++11 或更高版本。目前需要您下载并维护您自己的 IANA database 拷贝.如果您不想等待 OS 平台更新(您可以像数据库维护者一样响应),这可能是一件好事。
示例代码如下:
#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/Los_Angeles”)的变化。 IE。生日在 PST 期间,2G 后是夏令时:PDT。
在 gcc-5.2、clang、VS-2015 和最近的 gcc-4.8 上测试。
关于c++ - 使用时间位置将日期时间从/转换为 UTC 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33634567/