我试图用strftime
功能当前UTC时间进行编码转换为字符串:得到使用的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"
而且差异不(tm_gmtoff
),但。任何人都能解释这种行为吗或者它是一个错误?
我这样做的原因是我需要通过网络传输时间值,并将其与目标机器上可能处于不同时区的当前时间进行比较。在目标机器,我想:
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()
的不同结果有关?
对此后续部分的任何评论?
据我所知,'strftime()'将传递的时间结构解释为LOCAL TIME。由于原始'nowLocal'结构具有'tm_isdst = 1'(由前一次调用localtime_r()设置),因此您得到1小时的差异。如果在调用strftime之前将此字段设置为0,则可能会得到您期望的2小时差异。 – Claudix
考虑到你从time()的结果中获得了时间,你可以将它与'strftime()'返回的结果进行比较,以确定哪个答案是正确的(如果有的话) 。我的猜测是当地时间是正确的,UTC是错误的。你是否可以让'strftime()'工作,因为你不想将TZ变量设置为'UTC0',然后调用'tzset()'就可以讨论了。 –