phantomjs 错误地解析了 1400 年 3 月之前的日期,为什么?

phantomjs parses dates incorrectly for dates before March in the year of 1400, why?

是不是有点溢出了?

phantomjs> new Date("1400-03-01T00:00:00.000Z")
"1400-03-01T00:00:00.000Z"
phantomjs> new Date("1400-02-28T20:59:59.000Z")
"1400-02-27T20:59:59.000Z"

你会期望什么:

>>(new Date("1400-03-01T00:00:00.000Z")).toISOString()
"1400-03-01T00:00:00.000Z"
>>(new Date("1400-02-28T20:59:59.000Z")).toISOString()
"1400-02-28T20:59:59.000Z"

在解析 1400 年的 2 月 28 日和 1400 年的 3 月 1 日之间的日期时,显然存在 24 小时的差距。

有什么想法吗?

Phantomjs 无论如何已经过时了,但仍然......当我们尝试升级到 chrome headless 时,我们的遗留测试失败了......

PhantomJS 使用 Qt 的 Qt WebKit which is maintained independently 版本。

您使用的日期格式是 ISO-8601 日期和时间格式的一部分。 [related]

PhantomJS 使用的 Qt WebKit 版本具有解析 ECMA-262-5, section 15.9.1.15 (similar to RFC 3339 / ISO 8601 中定义的格式日期的函数:YYYY-MM-DDTHH:mm:ss[.sss]Z).

source code中,我们可以看到用来解析这些日期类型的函数调用的是:

double parseES5DateFromNullTerminatedCharacters(const char* dateString)

PhantomJS 存储库中包含此函数的文件尚未 updated since July 27, 2014, while the official file was updated 最近于 2017 年 10 月 13 日。

看来处理闰年的逻辑有问题

这是官方 qtwebkit 存储库(左)和 PhantomJS qtwebkit 存储库(右)的最新版本之间的 comparison of DateMath.cpp