4

我正在尝试使用以下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()

对后面的部分有任何评论吗?

4

3 回答 3

2

你可能最好只使用格林威治标准时间,因为gmtime_r它总是会在任何地方给你相同的答案。如果一台机器想要以本地时间显示,那可以稍后完成,但坚持使用一个时区进行存储和网络传输是个好主意,而且 GMT 值很容易获得。

于 2012-10-15T22:39:43.563 回答
0

我怀疑评论是正确的:strftime()将时间解释为当地时间。请注意,这tm_gmtoff不是一个标准化的字段;我想知道是否strftime()正在看它。但我找不到任何具体的东西来证实这一点。

但是,回答您问题的第二部分,为什么不time(NULL)直接通过网络传输结果呢?或者,如果您已经有时间以 a 的形式struct tm,使用mktime()转换为time_t然后转移? printf("%lu", (unsigned long) time)比尝试使用简单得多strftime("%s"),C99 或 POSIX 没有标准化。

于 2013-03-17T02:49:40.763 回答
0

Q1:谁能解释这种行为?或者它是一个错误?

是的,这是一个错误tsFromLocal:"1337772448"!= tsFromUtc: "1337768848"。但是错误在tsFromUtc中。它们应该是相同的,它们都应该是 1337772448。

1337772448%(24*60*60) --> 41248 是一天中的 UTC 秒数或 11:27:28,它与您的nowUtc结构匹配并且是您认为的时间(以 UTC 为单位)

Q2: ... 这个错误是否与 strftime() 的不同结果有关?

我同意time_t将整数用作网络通信的一般想法。

是的,看起来是这样。

now如果您想在这篇文章中走得更远:考虑发布紧随其后的数值,time(&now)并清楚地说明您当时预计的时间。

于 2013-08-25T04:54:34.010 回答