我想转换之间的日期-时间和时间戳在任意的时间地点(例如。America/New_York)
我正在对多个线程和不同的时区进行这些转换。给定线程的时间位置不会改变,因此我可以存储一些时区结构以供重复使用。
我知道,当DST更改发生时(一天2:30,2次或0次),第一次是不明确的。如果报告这样的情况,那将是额外的,但绝对不是一个优先事项。
更新:我想有一个跨平台的解决方案。Linux + Windows很好。我的意思是,它来自用户,与加工机器的位置无关。
发布于 2015-11-10 17:22:20
尝试使用完整的IANA时区数据库的免费、开放源码的现代解析器:
http://howardhinnant.github.io/date/tz.html
它需要C++11或更高版本。目前,它要求您下载并维护自己的IANA数据库副本。如果您不想等待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/洛杉矶”)的更改是正确的。也就是说,生日是在PST期间,2Gs之后是夏令时: PDT。
在gcc-5.2,clang,VS-2015上测试,最近一次测试,gcc-4.8。
发布于 2015-11-10 17:22:32
你可能想看看谷歌C++时区库
CCTZ (C++时区)是一个库,用于使用时区定义的规则在绝对时间和民事时间之间进行转换(请参阅下面的基本概念部分来解释这些术语)。 这个库目前在Linux和Mac上工作,使用安装在/usr/share/zoneinfo系统上的标准IANA时区数据。
https://stackoverflow.com/questions/33634567
复制相似问题