我有一个 time_t
表示自纪元以来的时间(以秒为单位)。这些秒是指当地时间。
我想将它们转换为 UTC。
有没有办法在 C++ 中做到这一点?
原文由 MATH000 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个 time_t
表示自纪元以来的时间(以秒为单位)。这些秒是指当地时间。
我想将它们转换为 UTC。
有没有办法在 C++ 中做到这一点?
原文由 MATH000 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用 gmtime:
将 time_t 转换为 tm 作为 UTC 时间 使用 timer 指向的值来填充 tm 结构,其中的值表示对应的时间,表示为 UTC 时间(即 GMT 时区的时间)。
© http://www.cplusplus.com/reference/ctime/gmtime/
原文由 AnatolyS 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答1.4k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
4 回答913 阅读
1 回答982 阅读
1 回答1k 阅读
1 回答772 阅读
1 回答873 阅读
我将展示两种方法:
<chrono>
的现代 C++11⁄14 库。出于本演示的目的,我假设本地时区的当前秒数为 1,470,003,841。我的本地时区是 America/New_York,所以我得到的结果反映我们目前在 -0400 UTC。
首先是 C API:
这个 API 不是类型安全的,而且很容易出错。我在编写这个答案时犯了几个错误,但我能够快速检测到这些错误,因为我正在对照第二种技术检查答案。
首先我初始化
time_t
。现在没有 C API 可以从本地time_t
到 UTCtime_t
。但是,您可以使用gmtime
从 UTCtime_t
到 UTCtm
(从串行到字段类型,全部采用 UTC)。所以第一步是对gmtime
_撒谎_,告诉它你有一个 UTCtime_t
。然后当你得到结果时,你只是假装你有一个本地的tm
而不是 UTCtm
。到目前为止清楚吗?这是:现在在你走之前(我个人第一次把这部分搞砸了)你必须增加这个字段类型来说明你不知道它当前是否是夏令时。这会导致后续步骤为您解决这个问题:
接下来,您可以使用
make_time
将本地tm
转换为 UTCtime_t
:你可以打印出来,对我来说是:
这是4小时更大。该功能的其余部分是以人类可读的格式打印出这些时间,以便您可以调试这些东西。对我来说它输出:
现代 C++ API:
std::lib 中不存在执行此操作的工具。但是,您可以为此使用这个 免费的开源(MIT 许可)库。
第一步是以秒为单位创建本地时间:
接下来要做的是创建一个
zoned_time
这是本地时间和当前时区的配对:然后您可以简单地打印出此配对的 UTC 秒数:
这个输出对我来说:
(比输入晚 4 小时)。要像我在 C API 中那样打印出这个结果:
输出:
在这种现代 C++ 方法中,本地时间和 UTC 时间是不同的类型,这使得我更有可能在编译时发现这两个概念的意外混合(而不是创建运行时错误)。
C++20 更新
第二种技术将在 C++20 中可用,语法如下: