2011-02-02 55 views
2

我的BlackBerry應用程序需要準確的時區支持。因爲它運行J2ME,所以Joda Time不是一個選項。在一些其他人的幫助下,我已經想出瞭如何讓Java的內置時區支持爲我工作,但事實證明,它仍然從夏令時切換到非夏令時的錯誤。你可以自己嘗試一下,甚至在Java 6:J2ME中的正確時區支持

TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles"); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeZone(zone); 

calendar.set(2011, Calendar.MARCH, 13, 1, 0, 0);  
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

calendar.set(2011, Calendar.MARCH, 13, 6, 0, 0); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

calendar.set(2011, Calendar.MARCH, 13, 23, 59, 59); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

calendar.set(2011, Calendar.MARCH, 14, 0, 0, 1); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

切換在2011年3月13日,在凌晨2點,但Java有它在3月14日午夜。這意味着幾乎整整一天都是錯誤的。這是不可接受的。

我已經着手實施基於this的自己的tzdata解析器,並將tzdata文件與我的應用程序一起發送,但是我想知道是否有更好的方法。你知道嗎?我不能成爲第一個遇到這個問題的人,對嗎?

回答

3

我想通了。 Java不是怪,我是。

問題是我用calendar.get(Calendar.MILLISECOND)作爲TimeZone.getOffset()的最後一個參數。該值是日曆中日期的毫秒部分,但TimeZone.getOffset()預期的是在整個一天過程中經過的毫秒數。

這是糾正代碼:

calendar.set(2011, Calendar.MARCH, 13, 1, 0, 0);  
int millis = 
    calendar.get(Calendar.MILLISECOND) + 
    calendar.get(Calendar.SECOND) * 1000 + 
    calendar.get(Calendar.MINUTE) * 60 * 1000 + 
    calendar.get(Calendar.HOUR_OF_DAY) * 60 * 60 * 1000; 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), millis)); 
+0

我幾乎犯同樣的錯誤。儘管javadoc註釋中存在信息,但該方法的參數的奇怪集合和「millis」參數的名稱並不容易。 :) – vaughandroid 2012-03-28 12:59:37