java - J2ME 中的正确时区支持

标签 java blackberry java-me timezone

我的 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/

相关文章:

Blackberry - 如何计算未读短信?

黑莓 BIS Option key 与 mds-public

c# - 我可以在 Windows 7 上使用 C# .NET 开发黑莓应用程序吗

java-me - lwuit.io.关闭应用程序后清除存储

java-me - 如何在 Canvas 上创建多个复选框

java - Dropwizard 中的 Jersey 过滤器设置一些全局 FreeMarker 变量

java - 没有接口(interface)使用spring DI是否正确

Java-替换字符串中的字符

java - 使用 J2ME 存储大量数据的最佳实践

java - 如何在 java 中使用 JPA Prepared 语句进行插入查询