2011-09-16 61 views
5

我在Suse 10中使用mktime(struct tm *)函數。在Linux上混淆mktime的行爲?

現在,我在夏令時啓用時注意到一些奇怪的行爲。假設我已啓用夏令時,從9月15日18:10開始,夏令時爲30分鐘。現在,當我用具有日期爲9月15日18:10且tm_isdst設置爲0的tm結構調用mktime時,則只有在tm_isdst設置爲1的情況下,我才能返回tm結構中的相同值。

但是,如果將日期設置爲9月15日18:10並將tm_isdst設置爲1,那麼我發現時間更改爲17:40。 tm結構中的這種修正在9月15日18:10到9月15日18:40之間的時間內被發現,但是之後沒有發生時間修正並且保持啓用dst標誌。即使我通過9月16日18:10的日期,也不會發生時間更正,只有dst標誌保持啓用狀態。

我完全困惑。這是mktime的正確行爲嗎?

回答

6

如果30分鐘DST,然後每年一次有那發生兩次本地時間30分鐘(與DST一次,一次不帶)和30分鐘即本地時間更改從來沒有發生(當時間改變時它會被跳過)。

因此,在時鐘恢復30分鐘內的當地時間是不明確的,除非指定了DST是否有效;有兩個實際時機可以對應。

提前設置時鐘30分鐘內的當地時間無效;沒有時間上可以對應的實際時間點(儘管轉換可能仍然通過假設DST生效或不生效)完成。因此,對於某些當地時間(忽略DST狀態),可能有多個相應的UTC時間,但對於任何給定的UTC時間,只有一個可能的本地時間(如果DST調整得到適當考慮)。

當您撥打mktime時,它將當地時間轉換爲time_t,就像DST有效或無效一樣,具體取決於tm_isdst的值。您得到的校正值取決於此轉換的反向值,系統將根據DST是否在轉換時生效的想法確定您是否獲得DST時間或非DST時間。你給它的時間和你回來的時間實際上代表了同一時刻,但由於不同的DST狀態,與UTC有不同的偏移量。

所以是的,這是mktime的正確行爲。根據它如何正確表示你給它的時間的想法,它應該規範化結構中的值。

這也說明了爲什麼一個人應該小心使用本地時間記錄實際事件 - 如果DST狀態或UTC的偏移量不隨時間保存,某些本地時間值可能不明確。

+0

我不知道。也許將時間18:10(dst 0)轉換爲mktime是未定義的,但我認爲在這種情況下返回最有用的東西應該是18:40(dst 1) –

0

退房this answer看看是否有幫助。另外,什麼是系統時區偏移?通過運行檢查:

date +%z 
+1

感謝您的回覆。系統時區偏移量返回+0830。但是,我的問題是爲什麼只有在DST啓用的時候,時間校正纔會發生。例如:DST設置爲在9月15日18:10啓用,所以問題從那個時間發生了半個小時。但是,9月16日18:10,問題不會發生。爲什麼? – Jay