2010-07-01 145 views

回答

1

你剛剛步入一個非常雜亂佈滿荊棘。夏令時的規則很複雜,由人設定,所以沒有可以使用的算法。有關想法,請參閱此頁:http://home.tiscali.nl/~t876506/TZworld.html。這隻顯示目前的規則。如果您想以編程方式或過去的日期獲取規則,則需要直接查詢tz數據庫。這並不容易也不重要,而且這個過程需要花費更長的時間來進行解釋(另外,我必須弄清楚:)),但您需要開始使用的信息位於此頁面上:http://www.twinsun.com/tz/tz-link.htm

如果你正在做的時間計算,需要採取移位考慮,它會更容易,只需使用喬達時間。這裏有一個鏈接:http://joda-time.sourceforge.net/。它具有所有的tz數據庫信息,所以你不必解析它。您需要保持最新狀態,因爲規則會定期更改。

作爲一個側面說明,有可能是查詢夏令開始和結束日期出喬達時間對於給定的時區的方式,但我找不到它。

+0

對於任何絆倒這個職位的人。關於如何使用Joda-Time來獲取下一個時區轉換,還有另一個關於stackoverflow的答案:http://stackoverflow.com/questions/1449500/get-daylight-saving-transition-dates-for-time-zones-in- java的 – Mike 2011-08-17 15:22:24

2

有沒有辦法直接做到這一點,但你可以使用TimeZone.isDaylightTime(日期),如:

TimeZone tz = TimeZone.getTimeZone ("America/Denver") ; 
Date date = new GregorianCalendar (2010, 10, 15).getTime() ; 
if (tz.isDaylightTime (date)) { 
// dst in effect code 
    } 
else { 
// dst not in effect code 
    } 

當然,得到的開始日期(如果那是你真的需要什麼) ,你需要迭代給定年份的所有日期並檢查每個日期......這將是非常低效的。另外,正如上面的答案中所指出的,據我所知,夏時制時間信息被編譯到java.util庫中,所以如果某個特定市鎮改變了它在dst開始/結束時的規則,你將得到不正確的結果。

另外,似乎在Android中java.util.TimeZone中實現(至少在2.2)斷裂。例如

TimeZone denver = TimeZone.getTimeZone ("America/Denver") ; 
TimeZone phoenix = TimeZone.getTimeZone ("America/Phoenix") ; 

== true; //它不應該

在Eclipse的模擬下運行,denver.hasSameRules(phoenix)返回true,它應該返回false:兩者都是格林威治標準時間-7:00,但菲尼克斯不使用dst。我無法訪問任何Android設備來測試這是否只是模擬器的問題。我實際上開始搜索這個檔案,爲這個丹佛==鳳凰問題的答案,並遇到你的帖子,所以認爲我會回答。

相關問題