我試圖用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()'就可以討論了。 –