Java中处理日期和时间的不一致性
我注意到java中日期和时间的奇怪行为。我有以下代码:
public class TestDateTime {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Helsinki"));
Calendar calendar = GregorianCalendar.getInstance();
assert(calendar.getTimeZone().equals(TimeZone.getDefault()));
//Set 1899-12-30T23:00:00
calendar.set(1899,11,30,23,0,0);
calendar.set(Calendar.MILLISECOND,0);
long timeInMillis = calendar.getTimeInMillis();
java.util.Date calendarDateTime = new java.util.Date(timeInMillis);
LocalDateTime localDateTime = LocalDateTime.ofInstant(ofEpochMilli(timeInMillis), ZoneId.systemDefault());
System.out.println("Time in millis: " + timeInMillis);
System.out.println("Date: " + calendarDateTime.toString());
System.out.println("Local DateTime: " + localDateTime.toString());
}
}
输出为:
Time in millis: -2209086000000
Date: Sat Dec 30 23:00:00 EET 1899
Local DateTime: 1899-12-30T22:39:49
timeInMillis必须包含从1970-01-01T00:00:00Z
传递的毫秒数。
Date类的实例存储从1970-01-01T00:00:00Z
传递的毫秒数。
Date.toString()
方法返回默认时区的本地日期和时间
因此Date.toString()
和LocalDateTime.toString()
必须返回相同的日期和时间,但我们看到了差异(超过20分钟)
这是java的一个bug,还是我在java中错误地使用了日期和时间
# 1 楼答案
正如其他人指出的,区别在于
Date
对象没有考虑LMT(local mean time)值。这在{a2}之前已经讨论过,关于{a3}——Java8的{a4}的前身此外,the Joda-Time FAQ还说:
最后一部分(我用粗体显示)与Joda Time和Java 8有关,尽管Java 8有一组时区数据文件(与Joda Time不同)
# 2 楼答案
LocalDateTime
是正确的。根据TZ数据库,该日期的GMT偏移量为^{历史时区极其复杂,在标准化之前,偏移量是从基于平均太阳正午之类的设置继承而来的。当追溯到那么远的时候,几乎任何偏移都是可能的,而IANA TZ database是历史数据的主要参考
从我在数据库中看到的情况来看,直到1921年HMT被EE(S)T取代,奇怪的偏移量才被标准化为
2:00:00
# 3 楼答案
这是芬兰时间变化造成的一种奇怪现象,见Clock Changes in Helsinki, Finland (Helsingfors) in 1921:
这20分11秒似乎就是你所观察到的
作为Jim Garrison said in his answer,
LocalDateTime
正确地处理了这个问题,而Calendar
则没有实际上,旧的
TimeZone
似乎得到了错误的偏移量,而新的ZoneId
得到了正确的偏移量,如以下测试代码所示:输出
# 4 楼答案
更准确地说,API不一致性:
虽然新的
java.time
-API总是使用TZDB的LMT信息,但我们还必须声明,旧的JDK类java.util.TimeZone
在1900年进行了削减,其结果是1900年之前没有考虑LMT信息,但是1900年之后,是的,它仍然被考虑到了!只要在合适的区域做实验。。。(例如亚洲/堪察加半岛)我们不能说
java.time
-API的LMT策略或传统的1900策略是正确的。还要记住,有一个open JDK-issue来废除LMT战略。引文:甲骨文的沈学明在本期评论中说:
作为额外的历史注释,JDK问题最初是由
java.time
-API S.Colebourne的主要作者提出的,另请参见ancestoron Three Ten issue tracker