c++ - 使用时间位置将日期时间从/转换为 UTC 时间戳

标签 c++ timezone

我想在任意时间位置(例如 America/New_York)在日期时间和时间戳之间进行转换

  1. (时间位置, (year, ..., sec)) ==> UTC 时间戳
  2. (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/

相关文章:

python - 如何在Python 2.7中计算两个时间字符串与时区的差异?

c++ - 为返回 C++/.NET 老手学习 Boost 的最快方法

C++ Win32 监听全局键绑定(bind)

c++ - 使用静态变量导致链接器错误

python - Pandas tz_localize : Infer dst when localizing timezone in data with duplicates

c# - 在 C# 中更改时区

c++ - 数组的大小 C++

c++ - 循环队列和循环链表

android - Joda DateTime 时区未正确显示

javascript - ExtJS 以 ISO 8601 格式显示来自服务器的日期/时间