我的 BlackBerry 应用程序需要准确的时区支持。因为它运行 J2ME,所以 Joda Time 不是一个选项。在其他人的帮助下,我已经弄清楚如何让 Java 的内置时区支持为我工作,但事实证明,从夏令时到非夏令时的切换仍然是错误的。您可以自己尝试一下,甚至在 Java 6 上也是如此:
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日午夜。这意味着几乎一整天都是错误的。这是 Not Acceptable 。
我已经开始基于 this 实现我自己的 tzdata 解析器,并通过我的应用程序发送 tzdata 文件,但我想知道是否有更好的方法。你认识一个吗?我不可能是第一个遇到这个问题的人,不是吗?
最佳答案
我明白了。 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));
关于java - J2ME 中的正确时区支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4881374/