2009-06-29 42 views
44

我有一個Java類,它可以在夏令時打開和關閉時獲取位置的緯度/經度並返回GMT偏移量。我正在尋找一種簡單的方法來確定在Java中,如果當前日期處於夏令時,那麼我可以應用正確的偏移量。目前我只在美國時區執行此計算,但最終我想將其擴展到全球時區。確定夏時制(DST)在Java中是否爲指定日期活動

+0

目前我正在使用GeoTools庫和美國國家地圖集提供的shapefile(http://nationalatlas.gov/mld/timeznp.html)檢索時區信息。幸運的是,這爲我提供了一些附加信息 - 主要是2或4位數的時區符號(即AL,EA,EAno等)。不幸的是,這個值並不對應於Java時區使用的值,儘管我可以手動執行此映射。理想情況下,如果我將該文件替換爲世界時區shapefile,那麼該解決方案可能會有效,但這可能太過雄心勃勃。 – gelgamil 2009-06-29 21:21:41

+0

timeznp020.txt列出了`Enumerated_Domain`s,其中包含每個所用縮寫的詳細信息;將它們映射到zoneinfo時區名稱不應太困難。我不確定Java中的時區名稱是否跨平臺,但我希望如此! – 2011-10-03 23:52:29

+0

對此問題有用的另一個答案http://stackoverflow.com/a/1449510/311525 – Scott 2014-05-07 05:18:21

回答

56

這是在其被問這個問題了機器的答案:

TimeZone.getDefault().inDaylightTime(new Date()); 

服務器試圖弄清楚這一點,爲客戶將需要在客戶端的時區。請參閱@Powerlord回答爲什麼。

對於任何特定的時區

TimeZone.getTimeZone("US/Alaska").inDaylightTime(new Date()); 
9
TimeZone tz = TimeZone.getTimeZone("EST"); 
boolean inDs = tz.inDaylightTime(new Date()); 
3

你將不得不使用這些座標做更多的工作,並找出他們在哪個時區。一旦你知道哪個時區是isDayLight()方法是有用的。例如,您無法判斷-0500是美國/加拿大東部標準時間,美國/加拿大中部夏令時,美國/加拿大中部夏令時,哥倫比亞時間,澳大利亞時間,巴西英畝標準時間, ,ECT(厄瓜多爾時間)等...

其中一些可能會或可能不支持夏令時。

18

TL;博士

ZoneId.of("America/Montreal") 
     .getRules() 
     .isDaylightSavings( 
      Instant.now() 
    ) 

java.time

這裏是現代java.time(參見Tutorialcorrect Answer版本mamboking

示例代碼:

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Montreal")); 
… 
ZoneId z = now.getZone(); 
ZoneRules zoneRules = z.getRules(); 
Boolean isDst = zoneRules.isDaylightSavings(now.toInstant()); 

注意如何在最後一行,我們不得不從我們ZonedDateTime對象與簡單的調用toInstant提取Instant對象。