【发布时间】:2018-06-28 06:20:44
【问题描述】:
我在将 GMT 时间转换为 unix EPOCH 时间时遇到了很多麻烦。
问题似乎与 mktime 有关。我当前的时区提前 +13 小时。 我认为这是问题所在,mktime 假定为本地时间,当它计算一个纪元时,它返回的值比实际 GMT 时间早大约 12 小时。
这是我的代码。
time_t t;
struct tm tm;
strptime(s, "%Y-%m-%dT%H:%M:%SZ", &tm);
tm.tm_isdst = -1; // -1 tells mktime figure it out
t = mktime(&tm);
当 s = "2018-01-19T03:35:12Z" 时,它计算的纪元为 1516286112 而不是应该提前大约 12 小时的时代。
在 BIOS 时钟设置为 GMT 的系统上,不会发生此错误。 所以我只能得出结论,当这种情况属实时,mktime 正在按预期工作。
顺便说一句,该字符串来自在文档上显示正确时间的 nosql 服务器。我正在获取当前时代并将其与文档中的解析日期进行比较并计算差异。这就是一切变得混乱的地方!
【问题讨论】:
-
mktime 采用当地时间...
-
是的,那就是问题所在。我想我可以计算它并添加偏移秒数。
-
我写了some code 来做这件事,一次。它不是特别漂亮,但通常有效。
timegm()不是标准的,但您可能可以使用。 -
更改时区,然后调用
mktime()。 -
注意:
struct tm tm; strptime(s, "%Y-%m-%dT%H:%M:%SZ", &tm); tm.tm_isdst = -1;在技术上是不够的,因为tm中的其他成员可能存在未初始化。最好先struct tm tm = {0};