gpt4 book ai didi

java - J2ME 中的正确时区支持

转载 作者:行者123 更新时间:2023-12-04 06:35:55 25 4
gpt4 key购买 nike

我的 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 日午夜。这意味着几乎一整天都是错误的。这是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com