首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用时间位置将日期-时间从/转换为UTC时间戳

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

Stack Overflow用户
提问于 2015-11-10 16:15:42
回答 2查看 952关注 0票数 2

我想转换之间的日期-时间和时间戳在任意的时间地点(例如。America/New_York)

  1. (时间位置,(年份,.,秒)) ==> UTC时间戳
  2. (UTC时间戳,时间位置) ==> (年份,.秒,dayOfWeek)

我正在对多个线程和不同的时区进行这些转换。给定线程的时间位置不会改变,因此我可以存储一些时区结构以供重复使用。

我知道,当DST更改发生时(一天2:30,2次或0次),第一次是不明确的。如果报告这样的情况,那将是额外的,但绝对不是一个优先事项。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-10 17:22:20

尝试使用完整的IANA时区数据库的免费、开放源码的现代解析器:

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

它需要C++11或更高版本。目前,它要求您下载并维护自己的IANA数据库副本。如果您不想等待OS平台更新(您可以和数据库维护人员一样响应),这可能是件好事。

下面是示例代码:

代码语言:javascript
复制
#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 (千兆秒)生日,并输出:

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2015-11-10 17:22:32

你可能想看看谷歌C++时区库

CCTZ (C++时区)是一个库,用于使用时区定义的规则在绝对时间和民事时间之间进行转换(请参阅下面的基本概念部分来解释这些术语)。 这个库目前在Linux和Mac上工作,使用安装在/usr/share/zoneinfo系统上的标准IANA时区数据。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33634567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档