javascript getTime() 和 Java getTime() 之间的区别

Difference between javascript getTime() and Java getTime()

Java 和 Java脚本似乎对负毫秒值给出了不同的结果。

JAVA:

System.out.println(new Date(-12220000000000L));
Wed Sep 26 12:33:20 MST 1582

Java脚本:

console.log(new Date(-12220000000000));
 Date {Wed Oct 06 1582 12:33:20 GMT-0700 (LMT)}

他们的产出有 10 天的差异。但对于某些值,差异小于 10 天。我使用 W3C TryIt 编辑器来测试 JavaScript 输出。我不知道偏差从哪里开始。我是不是做错了什么?

java getTime()javascript getTime() returns 自格林威治标准时间 00:00:00 1970 年 1 月 1 日以来已经过去了很多毫秒。负参数计算过去的日期。

我找到了 bug in jdk。阅读这篇文章似乎在 jdk 7 从 1582 年 10 月 5 日到 1582 年 10 月 15 日 缺少 10 天。我认为与 javascript getTime() 的 10 天差异来自这个错误。

使用nashorn,你可以看到它们何时偏离:

> function printDate(x) { System.out.println(new Date(x) + " - " + new java.util.Date(x)); }

> printDate(-12219292800000)
Fri Oct 15 1582 00:00:00 GMT+0000 (GMT) - Fri Oct 15 00:00:00 GMT 1582

> printDate(-12219292800001)
Thu Oct 14 1582 23:59:59 GMT+0000 (GMT) - Thu Oct 04 23:59:59 GMT 1582

这对应于 Julian to Gregorian calendar 的开关。

Java 的日期库考虑了这一变化,但 JavaScript 的没有。

Julian to Gregorian calendar in Java's GregorianCalendar class "is October 15, 1582 (Gregorian). Previous to this, dates will be in the Julian calendar."

切换的默认日期

因此,OP 的 Java 日期 1582 年 9 月 26 日是儒略日期。 1582 年的儒略历和公历之间的差异是 10 days

如果有问题的Java脚本实现不遵守从儒略到公历的转换,而是使用公历日期,而不管我们处于 OP 遇到的情况的时间点。