gpt4 book ai didi

c - 使用 strftime() 获取 utc 时间戳

转载 作者:太空狗 更新时间:2023-10-29 15:39:13 35 4
gpt4 key购买 nike

我正在尝试使用 strftime 函数将当前 utc 时间编码为字符串:

time_t now;
struct tm nowLocal;
struct tm nowUtc;

now = time(NULL);
localtime_r(&now, &nowLocal);
gmtime_r(&now, &nowUtc);

到目前为止一切顺利:nowLocal 包含我所在时区 (CET) 的当前时间,nowUtc 包含 utc 时间,区别完全取决于 tm_gmtoff 值:

nowLocal: {tm_sec = 28, tm_min = 27, tm_hour = 13, tm_mday = 23, tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143, tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8127a38 "CEST"}

nowUtc: {tm_sec = 28, tm_min = 27, tm_hour = 11, tm_mday = 23, tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143, tm_isdst = 0, tm_gmtoff = 0, tm_zone = 0x3e9907 "GMT"}

然后我用 "%s" 格式调用 strftime() 来获取自纪元以来的秒数:

char tsFromLocal[32];
char tsFromUtc[32];

strftime(tsFromLocal, sizeof(tsFromLocal), "%s", &nowLocal);
strftime(tsFromUtc, sizeof(tsFromUtc), "%s", &nowUtc);

结果对我来说似乎很奇怪。我希望从 strftime() 调用中得到完全相同的字符串,因为 %s 格式被描述为:

自纪元以来的秒数,即自 1970-01-01 00:00:00 UTC 以来。除非闰秒支持可用,否则不计算闰秒。

但是我得到了两个不同的值:

tsFromLocal:"1337772448"

tsFromUtc: "1337768848"

此外,区别不是 7200 (tm_gmtoff),而是 3600 .谁能解释这种行为?或者这是一个错误?

我这样做的原因是我需要通过网络传输时间值并将其与可能处于不同时区的目标机器上的当前时间进行比较。在目标机器上我想:

struct tm restoredUtc;
time_t restored;

strptime(tsFromUtc, "%s", &restoredUtc);
restored = timegm(&restoredUtc);

但是我得到了:

restoredUtc:{tm_sec = 28, tm_min = 27, tm_hour = 12, tm_mday = 23, tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143, tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8127a38 "CEST"}

所以 strptime() 无论如何都会根据当前时区设置 tm_zone。但即使我使用 timelocal() 而不是 timegm() 我也不会得到正确的值,因为它应该是 11:27:28 CEST 而不是 12:27:28 CEST。此错误是否与 strftime() 的不同结果有关?

对后面的部分有什么意见吗?

最佳答案

您最好始终使用 GMT,因为 gmtime_r 始终会在任何地方为您提供相同的答案。如果个别机器想显示本地时间,可以稍后再做,但是坚持一个时区进行存储和网络传输是个好主意,而且 GMT 值很容易获得。

关于c - 使用 strftime() 获取 utc 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719310/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com