這裏的問題是time_t
應該表示自紀元以來的秒數(簡化,參見腳註)。這不受時區影響。如果將時區偏移量添加到time_t
,則沒有任何功能將按預期工作。部分問題是,有時不可能知道如何正確地將這樣的值轉換爲POSIX時間戳 - 當時鍾在秋季回滾時,我住的時鐘將在相同時間兩次讀取1:30 AM一天,沒有更多的信息,你無法弄清楚UTC時間是什麼。
在轉換爲POSIX時間戳之前,您需要將其轉換爲本地日曆時間,然後才能轉換爲UTC日曆時間。
// NOTE: not reentrant
time_t local_to_posix(time_t t) {
struct tm *tm;
time_t tt;
tm = gmtime(&t); // No timezone compensation
tm->tm_isdst = -1; // Let mktime figure out daylight savings
// NOTE: this WILL be wrong for one hour each year
tt = mktime(tm); // Converts local time to POSIX timestamp
return tt;
}
您可以將結果再傳給gmtime
,這將給你的UTC日曆時間。
腳註:嚴格地說,這些時間戳不是UTC,也不是測量自epoch以來的秒數。它們是POSIX時間戳,從曆元開始算起秒,就好像沒有閏秒一樣。除非你的實時時鐘是一個原子鐘,否則這可能是無關緊要的。
set_TZ設置TZ變量,它的存在表明該時區設置正確。它用於解析POSIX格式。 – nikolas