2009-11-19 66 views
1

功能mktimestruct tm作爲參數。 struct tm的成員之一是tm_isdst。您可以將此設置爲冬季爲1,夏季爲0,如果您不知道則爲-1。在冬季將夏季日期轉換爲utc?

但是,如果在冬季期間,您嘗試轉換2009-09-01 00:00,mktime未能看到,雖然目前是冬天,但您轉換的日期是夏令時。所以結果是一個小時。對我來說(GMT + 1)是2009-08-31 22:00,而它應該是23:00

有沒有辦法確定一個特定的日期是在夏季還是冬季?冬季有可能將夏季日期轉換爲utc嗎?

(我偶然發現這個問題,試圖回答this question

回答

5

這是在time處理中還標準C.見的Olson時區數據庫interfaces的(多)deficiencies之一。例如,找到時區在冬季和夏季(夏令時和標準時間)之間切換的時間並不是一個簡單的方法。當然,未來的任何事情都是預測 - 規則經常會改變(當前版本爲2017a)。

只要你知道,UNIX的具體解決方案?

我看了看在tzcode2017a.tar.gz的代碼,只要你想,如果你設置tm_isdst的爲-1(未知)的mktime()有表現。所以,如果你使用那個(公共領域)代碼,你會沒事的 - 可能吧。從引用「本地時間(3)」與所述奧爾森代碼分佈:

Mktime轉換破碎下降時間,表示爲本地時間,在該結構指向TM成日曆時間值與相同的編碼作爲由時間函數返回的值的值。該結構的tm_wdaytm_yday組件的原始值將被忽略,並且其他組件的原始值不受其正常範圍的限制。 (對於tm_isdsttm_isdst的正值或零值會導致mktime最初假定該夏令時(例如,美國的夏令時)分別在指定的時間內有效或沒有生效,tm_isdst的負值會導致mktime函數試圖神聖的夏季時間是否在指定的時間效應;在這種情況下,它不使用統一的規則,並可能給了不同的答案,當後來使用相同的參數提交)

我相信最後。關於「一致性規則」的說明意味着如果時區的規格發生變化(例如,當美國從四月的第一週變更爲三月的第二週,因爲改變爲夏令時)意味着如果您確定在規則改變之前的一段時間,在規則改變之後,相同的輸入數據會給出不同的輸出。

(注有在ftp://ftp.iana.org/tz/目錄有用的HTML文件,如ftp://ftp.iana.org/tz/tz-link.html。)

+0

+1有趣。據你所知,有一個UNIX特定的解決方案嗎? – Andomar 2009-11-19 20:47:09