将日期从人类可读格式转换为纪元失败
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(&tmNow)
是真的)。如果系统时区使用 DST,则 timeNow == mktime(&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;
。
【讨论】:
以上是关于将日期从人类可读格式转换为纪元失败的主要内容,如果未能解决你的问题,请参考以下文章