我试图使用 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 ()
() with "%s"
格式的 "%s"
格式,以获得自时代以来的秒数:
char tsFromLocal[32];
char tsFromUtc[32];
strftime(tsFromLocal, sizeof(tsFromLocal), "%s", &nowLocal);
strftime(tsFromUtc, sizeof(tsFromUtc), "%s", &nowUtc);
结果对我来说似乎很奇怪。 我期望从两个 strftime ()
调来与 s
格式完全相同的字符串, 被描述为 :
自此时代以来的秒数, 即自 < code> 1970-01- 01-0 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
) 根据当前时区设置
, 我也不会得到正确的值, 因为它应该是 tm_zone
> 。 但是,即使我使用 timegm ()
而不是 timegm ()
strftime ()
的不同结果有关?
对这一后半部分有何评论?