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

Difference between javascript getTime() and Java getTime()

本文关键字:getTime 区别 之间 javascript Java      更新时间:2023-09-26

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

JAVA:

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

JavaScript:

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

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

Java的GregorianCalendar class中从儒略历切换到格里高利历的默认日期"是1582年10月15日(格里高利)。在此之前,日期将在儒略历中。"

因此,OP的Java日期1582年9月26日是儒略历。1582年的儒略历和格里高利历相差10天。

如果有问题的JavaScript实现不尊重儒略到格里高利的切换,而是使用格里高利日期,而不管我们所处的时间点是OP所经历的情况。

使用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

这对应于从儒略历到格里高利历的转换。

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

java getTime()javascript getTime()都返回自1970年1月1日00:00:00 GMT以来经过的许多毫秒。负参数计算过去的日期。

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