我正在尝试使用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"}
然后我用strftime()
格式调用"%s"
来获取纪元以来的秒数:
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()
的不同结果有关?
对此后期部分的任何评论?
答案 0 :(得分:2)
你可能最好只使用GMT,因为gmtime_r
总会给你相同的答案。如果一台机器想要在当地时间显示,这可以在以后完成,但坚持一个时区进行存储和网络传输是一个好主意,并且GMT值很容易获得。
答案 1 :(得分:0)
我怀疑评论是正确的:strftime()
将时间解释为当地时间。请注意,tm_gmtoff
不是标准化字段;我想知道strftime()
是否在看它。但我找不到任何具体的信息来证实这一点。
但是,回答问题的第二部分,为什么不直接通过网络传输time(NULL)
的结果?或者,如果您已经有struct tm
形式的时间,请使用mktime()
转换为time_t
,然后转移? printf("%lu", (unsigned long) time)
比尝试使用{C}或POSIX未标准化的strftime("%s")
要简单得多。
答案 2 :(得分:0)
问题1:有人可以解释这种行为吗?或者这是一个错误?
是的,这是tsFromLocal:"1337772448"
!= tsFromUtc: "1337768848"
中的错误。但该错误发生在 tsFromUtc 中。它们应该是相同的,它们都应该是1337772448。
1337772448%(24 * 60 * 60) - > 41248是当天的UTC秒或11:27:28,它与您的nowUtc
结构匹配,是您认为的时间(以UTC为单位)
Q2:...这个错误是否与strftime()的不同结果有关?
我同意将time_t
用作网络通信整数的一般想法。
是的,看起来是这样。
如果你想进一步发表这篇文章:考虑在now
之后立即发布time(&now)
的数字值,并明确说明你预期的时间。