【问题标题】:Correct time zone support in J2MEJ2ME 中的正确时区支持
【发布时间】:2011-02-03 10:52:00
【问题描述】:

我的 BlackBerry 应用程序需要准确的时区支持。因为它运行 J2ME,所以 Joda Time 不是一个选项。在 SO 上其他一些人的帮助下,我想出了如何使 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 日午夜。这意味着几乎一整天都是错误的。这是不可接受的。

我已经着手实现我自己的基于this 的 tzdata 解析器,并将 tzdata 文件与我的应用程序一起发送,但我想知道是否有更好的方法。你认识一个吗?我不能成为第一个遇到这个问题的人,可以吗?

【问题讨论】:

    标签: java blackberry java-me timezone


    【解决方案1】:

    我想通了。 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));
    

    【讨论】:

    • 我几乎犯了同样的错误。尽管信息在 javadoc cmets 中有,但该方法的奇怪参数集和“millis”参数的名称并不容易。 :)
    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多