2013-06-24 30 views
1

我正在使用strptime解析用戶日期輸入字符串與以下格式化程序:%F %T %z爲格式YYYY-MM-DD HH:MM:SS +-UTC offset。我想添加一個選項,以便用戶可以指定夏令時是否生效(0或1),並相應地設置tm_isdst。這很重要,因爲我稍後使用用戶的輸入轉換爲UTC紀元時間,而本地時區偏移取決於DST。我在轉換前存儲用戶的tm_gmtoff,因爲mktime適應當地時間,然後根據其偏移量輸入進行相加或相減。strptime函數和切換tm_isdst

是否有任何格式化程序可以在strptime之內直接切換DST,還是需要找出另一個解決方案?

+2

如果您的UTC有一個數字偏移量,則用戶的時區是夏令時還是標準時間無關緊要。當你有時區名稱時,這很重要。即使是從秋天01:59:59到01:00:00秋季的小時,數值時區偏移也是毫不含糊的; 01:30:00的值發生兩次,但有兩個不同的數字偏移量。 –

+0

它對我很重要,因爲我稍後將根據用戶的UTC偏移量和輸入的時區確定UTC偏移量。如果是本地時間(在DST期間爲-04偏移量),我以某種方式調整爲UTC,因爲mktime默認爲本地時間,而如果用戶不在本地時區中,則使用mktime和本地時間偏移調整爲UTC。瞭解本地時區的本地偏移量是否爲-04或-05小時對我的轉換而言是否重要。 –

+0

我很困惑。如果我輸入:2013-xx-yy 08:31:23 -05:00,我是否在美國/中部,這是標準時間還是美國/東部和夏令時; UTC時間仍然是2013-xx-yy 13:31:23,因爲時區偏移量是用數字表示的。那麼,你有什麼用戶類型?他們是在指定數字偏移量還是你的程序推斷它?在'strptime()'推導出數字偏移量後,你可能會遇到'mktime()'等問題。但這並不是'strptime()'可以提供的幫助。時區處理在C(標準或POSIX)中至多是最基本的。 –

回答

1

雖然給出的答案告訴了我很多關於strptime和UTC偏移的問題,但我的問題是,是否有方法通過strptime設置DST,因爲我擔心mktime()會使用系統的本地時間。不幸的是,沒有格式化程序,所以我重寫了我的代碼,以便根據提供的小時偏移量手動轉換爲UTC,然後使用gmtime轉換爲時期時間戳。

0

由於@Jonathan萊弗勒指出,尋找在UTC在YYYY-MM-DD HH:MM:SS +-UTC offset偏移通常的方式是從UTC偏移日期&時間,而不是標準的用戶的時區偏移。因此有沒有有關時區名稱和DST規則的信息,只是一個偏移量。

要轉換輸入time_t的(UTC的時期),如果strptime()理解%F %T %z,後strptime()通話,通話gmtime()。無需考慮DST。如果您的strptime()不理解%z,則自己解析偏移量並從strptime()調用的tm_min字段中減去分鐘結果,然後致電gmtime()

在另一方面,您的應用程序可能會試圖採取不同的方法,提示用戶輸入日期,時間和標準時間偏移用戶的時區。在這種情況下,知道該日期的DST是否有效&時間是需要的。在那裏有各種strptime(),可能有一個DST旗的%,但我沒有看到一個,你可能需要做工作。如上所述轉換,如果設置了DST,則減去通常的3600秒。 * 3


**的strptime()的行爲可能由LC_CTYPE,LC_TIME和LC_TOD當前區域設置類別的影響。如果%F不起作用,請嘗試%Y-%m-%d

* 3 區別偏離標準時間到日光時間通常爲3600秒。我知道現在沒有例外。存在歷史例外。

+0

「3600秒的倍數」也有例外。紐芬蘭在夏令時UTC-04:30運行;印度在UTC + 05:30上運行,尼泊爾在UTC + 5:45上運行,兩者都沒有夏令時。有關更多信息,請參閱http://www.worldtimezone.com/。 –

+0

@Jonathan Leffler - 「DST偏移量通常是3600秒的倍數」。意思是說「由於DST導致的偏移量通常是3600秒 - 存在異常。」你同意嗎? – chux

+0

對不起 - 是的;我的意思是UTC偏移量通常是3600的倍數(除了註明的例外)。距標準時間的DST偏差通常爲1小時;我相信有一些例外(澳大利亞的部分地區),其差異是30分鐘,歷史上有一些有趣的制度,例如英國的雙重夏令時,以及一年內抵消(多於2次)的多次變化。人們無窮無盡的創造力。 –