2011-02-02 56 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