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

时间:2015-11-10 16:15:43

标签: c++ timezone

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

  1. (时间位置,(年,...,秒))==> UTC时间戳
  2. (UTC时间戳,时间位置)==> (年,...,秒,dayOfWeek)
  3. 我正在做多个线程和不同时区的转换。给定线程的时间位置没有变化,因此我可以存储一些时区结构以供重复使用。

    我知道当DST发生变化(一天两次或两次2:30)时,第一次变得模棱两可。如果报告这样的情况会是额外的,但绝对不是优先事项。

    更新:我希望有一个跨平台的解决方案。 Linux + Windows很好。任意地,我的意思是它来自用户,与加工机器的位置无关。

2 个答案:

答案 0 :(得分:3)

试试这个完整的IANA时区数据库的免费开源现代解析器:

http://howardhinnant.github.io/date/tz.html

它需要C ++ 11或更高版本。它目前要求您下载并维护自己的IANA database副本。如果您不想等待操作系统平台更新(这可能与数据库维护人员一样响应),这可能是一种祝福。

以下是示例代码:

#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的2G(gigasecond)生日,并输出:

born        : 1954-04-24 10:03:00 PST
2Gs birthday: 2017-09-08 14:36:20 PDT

请注意,所有算术都是在(隐含的)UTC时区中完成的,因此可以正确地考虑本地时区(&#34; America / Los_Angeles&#34;)中的更改。即生日是在PST期间,2G以后是夏令时:PDT。

在gcc-5.2,clang,VS-2015以及最近的gcc-4.8上进行了测试。

答案 1 :(得分:3)

您可以查看Google C++ Time Zone Library

  

CCTZ(C ++时区)是一个使用时区定义的规则在绝对时间和公民时间之间进行翻译的库(请参阅下面的基本概念部分中有关这些术语的解释)。

     

此库目前适​​用于Linux和Mac OS X,使用系统中安装的标准IANA时区数据/ usr / share / zoneinfo。