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

时间:2018-07-19 16:05:01

标签: phantomjs

是某种溢出吗?

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时,我们的传统测试失败了...

1 个答案:

答案 0 :(得分:1)

PhantomJS使用的Qt WebKit版本是Qt的maintained independently

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

PhantomJS使用的Qt WebKit版本具有一个功能,该功能可以解析ECMA-262-5, section 15.9.1.15中定义的格式的日期(类似于RFC 3339 / ISO 8601YYYY-MM-DDTHH:mm:ss[.sss]Z)。 / p>

source code中,我们可以看到用于解析这些类型的日期的函数称为:

double parseES5DateFromNullTerminatedCharacters(const char* dateString)

自2014年7月27日以来,PhantomJS存储库中包含此功能的文件从未updated,而官方文件是2017年10月13日之前的updated

似乎与处理leap年有关的逻辑上存在问题

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