2016-11-18 64 views
0

我在使用日曆實例從日光節約結束並過渡到標準時間時減去一小時時看到此問題。 這裏是代碼:使用java日曆的DST問題日曆

Date startTime = new Date();// Gives me Sun Nov 06 01:26:16 EST 2016 
Calendar temp; 
TimeZone timezone = TimeZone.getDefault(); //Eastern 
temp= Calendar.getInstance(timezone); 
temp.setTime(startTime); 
temp.add(Calendar.HOUR_OF_DAY, -1); 
temp.set(Calendar.MILLISECOND, 0); 
    Date endDate = temp.getTime(); // This is still Sun Nov 06 01:26:16 EST 2016 

結果,我希望在結束日期是Sun 2006年11月1時26分16秒EDT 2016,而不是太陽2006年11月1時26分16秒美國東部時間2016年。我不知道如果這是否與設計一樣。如果我減去2小時,然後我看到它工作正常。 對此有何意見?

感謝, SS

回答

1

使用java.time

您應該使用java.time類,而不是麻煩的舊日期,時間類,如Calendar比現在的傳統。

請務必閱讀ZonedDateTime的班級文檔以瞭解如何處理夏令時(DST)切換的選擇。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,例如ESTEDTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/New_York"); 
// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone) 
ZonedDateTime zdt = ZonedDateTime.of(2016 , 11 , 6 , 1 , 26 , 16 , 0 , z); 
ZonedDateTime zdtOneHourEarlier = zdt.minusHours(1); 
ZonedDateTime zdtOneHourLater = zdt.plusHours(1); 

請注意每個結果的偏移距UTC。

zdt.toString():2016-11-06T01:26:16-04:00 [美國/紐約]

zdtOneHourEarlier.toString():2016-11-06T00:26:16 04:00 [美國/紐約]

zdtOneHourLater.toString():2016-11-06T01:26:16-05:00 [美國/紐約]

參見此代碼run live at IdeOne.com


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore