【发布时间】: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