将日期从人类可读格式转换为纪元失败

Posted

技术标签:

【中文标题】将日期从人类可读格式转换为纪元失败【英文标题】:Conversion of date from human-readable format to epoch fails 【发布时间】:2021-11-11 04:36:55 【问题描述】:

我想创建一个程序,将特定人类可读格式的日期转换为纪元。

到目前为止,我有以下代码,第一部分创建这种人类可读的格式,第二部分将其转换为纪元。

#include <time.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstring>

using namespace std;

int main(int argc, char const *argv[])

     time_t timeNow;
     struct tm *ltm = NULL;
     time(&timeNow);
     ltm = localtime(&timeNow);
     char buffer[100];
     strftime(buffer, sizeof(buffer), "%c %Z", ltm);
     cout << "human readable timestamp  is " << buffer << endl;
     std::tm tmNow;
     memset(&tmNow, 0, sizeof(tmNow));
     strptime(buffer, "%c %Z", &tmNow);
     cout << "epoch timestamp  is " <<  mktime(&tmNow) << endl;
     return 0;

所以我得到的打印输出如下:

human readable timestamp is Thu Sep 16 10:23:06 2021 EEST
epoch timestamp  is 1631780586

我的时区是 EEST 可以看到,但时代是错误的,因为它提前一小时。正确的应该是 1631776986。我认为我在当地时间做错了什么。我找到了第三方库示例,例如 boost 或 poco 可以进行这种转换,但我更喜欢使用本机 C++ 来完成上述转换。 有人看到我错过了什么吗?

【问题讨论】:

time_t 始终是 UTC,返回的值对我来说是正确的(8:23:06 UTC == 10:23:06 EEST) @AlanBirtles 。从这个网站epochconverter.com,当放置 1631780586 时,它会给出以下 GMT:2021 年 9 月 16 日星期四上午 8:23:06 您的时区:2021 年 9 月 16 日星期四上午 11:23:06 GMT+03: 00 DST 啊,是的,eest 是 3 小时而不是 2 小时 在 Ubuntu AMD64 中,如果系统时区不使用 DST,那么它应该可以正常工作(timeNow == mktime(&amp;tmNow) 是真的)。如果系统时区使用 DST,则 timeNow == mktime(&amp;tmNow) 为 false。这不是最好的解决方案,但它可以由tmNow.tm_isdst = -1;strptime 之前修复。另见:When you use strptime tm_isdst is unitialized 和 strptime Function and toggling tm_isdst 【参考方案1】:

C 计时/日历 API 很难正确使用(这就是 C++ 远离它的原因)。

来自C standard:

如果夏令时有效,tm_isdst 的值为正,如果夏令时无效,则为零,如果信息不可用,则为负。

在调用mktime之前设置tmNow.tm_isdst = -1;

【讨论】:

以上是关于将日期从人类可读格式转换为纪元失败的主要内容,如果未能解决你的问题,请参考以下文章

以人类可读格式转换纪元时间

将 JSON 纪元时间转换为本地人类可读日期

如何将 13 位 unix 纪元时间格式转换为日期时间?

如何在 python 中将普通时间戳转换为纪元时间戳

如何使用 sed 将纪元转换为人类可读的日期时间

如何使用人类可读的日期格式将BSON转换为JSON