2009-07-17 70 views

回答

3

GetTimeZoneInformation是你需要的。

您可以調用它並檢查返回值以檢測呼叫時是否啓用夏令時。它還填充了包含切換到夏令時和夏令時規則的結構。使用這種結構填充以及UTC格式的任何給定時間,可以相對容易地計算出該時間是否符合夏令時或標準時間。

+0

是否有任何Linux相當於?或者更好的封裝它的lib?我會檢查提升;) – neuro 2009-07-17 07:51:58

0

一切順利,但GetTimeZoneInformation和GetDynamicTimeZoneInformation僅返回當前時區設置。如果當前的TZ(即我的服務器所在的地方)不是我想要檢查的TZ,該怎麼辦?

比方說,我有一臺服務器應用程序可以爲結帳預訂書籍。您可以說「我想現在查看」或「我將需要在將來datetime」查看。結帳時間在用戶的當地時間輸入,並在存儲之前轉換爲UTC。當用戶檢索他們的結賬列表時,時間被轉換回他們的本地進行顯示。

假設服務器住在紐約,並在美國的標準2007年後DST規則下運行。時區設置爲美國東部,目前它是2009年7月27日15:30,因此DST爲ON。

紐約的用戶輸入當地的日期和時間。從ET轉換到UTC - 不是問題。他們進入未來的日期 - 沒問題。我使用上面兩個API調用之一併找出它。

但是,悉尼的用戶想要預訂結帳。她在12/13/2009 18:25要求在悉尼當地時區結賬。我無法使用當地的TZ信息 - 悉尼和紐約不遵守相同的DST規則。我如何着手加載悉尼目前的TZ信息並找出是否有任意日期是DST?

0

對於Win7和Server2008/R2,在MS-Windows上有一些更新(但仍然不完整)的方法。請參閱知識庫文章2731771.另請參閱ICU和Boost :: locale。 Windows例程(GetTimeZoneInformationForYear)要求您將UTC轉換爲最低年份。幸運的是,在我所知道的1月1日左右沒有時區正確轉移。您可以使用SystemTimeToTzSpecificLocalTime(Ex)將本地時間正確轉換爲與本地系統時區不同的時區。 如果沒有這些方法,您需要掃描註冊表以加載適當的時區信息和動態信息,然後調用SystemTimeToTzSpecificLocalTime。 使用諸如_tzset和localtime之類的東西時要小心,因爲即使您的TZ設置適用於澳大利亞,某些系統(如Windows)也會假設使用美國DST規則等許多(大部分不正確)的事情。

您會認爲Windows和Linux都會採用UTCtoLocal(const char * tzName,time_t inTime,struct tm * outTime)等類似的方法來考慮所有動態/歷史DST規則給出的區域。根據您運行的系統,tzName應該能夠採用適當的名稱,如「中央標準時間」或「美國/芝加哥」。我甚至願意允許一個兩個調用步驟,例如: GetTimeZoneInformation(const char * tzName,TIME_ZONE_INFORMATION * outTZInfo) UTCtoLocal(const TIME_ZONE_INFORMATION * inTZInfo,time_t inTime,struct tm * outTime) 您知道OS已經在做當它加載系統時區信息並且庫執行本地/ UTC轉換時。