传递给date构造函数的Javascript日期字符串给出了奇怪的结果

Javascript date string passed to Date constructor gives strange results

本文关键字:结果 字符串 Javascript date 构造函数 日期      更新时间:2023-09-26

为什么在创建新日期时,使用类似格式的日期字符串会得到如此不同的结果?

CHROME

(43.0.2357.134 m)控制台:

<>之前新日期(2014 - <我>目前消费量 ')星期三Dec 24 2014 17:00:00 GMT-0700(山区标准时间)[Chrome假定Z为00:00 (utc)并返回该本地时间]新日期(2014 - <我> 1 - 25 ')Sat Jan 25 2014 00:00:00 GMT-0700(山区标准时间)(什么? !完全相同的格式(我认为),但返回25而不是24....看到未来…]新日期(2014 - <我> 01-25 ')星期五Jan 24 2014 17:00:00 GMT-0700(山区标准时间)[…哦,前导0使它使用第一个示例中使用的逻辑]新日期("2014/12/25")星期四Dec 25 2014 00:00:00 GMT-0700(山区标准时间)[使用/代替-,得到我相信大多数人会期望的结果(?):当地时间在指定的同一日期]之前

FIREFOX (39.0) console:

<>之前新日期("2014-12-25")2014 - 12 - 25 t00:00:00.000z日期[不同于Chrome]新日期("2014-1-25")无效的日期[与Chrome不同,Firefox无法识别]新日期("2014-01-25")2014 - 01 - 25 - t00:00:00.000z日期[不同于Chrome]新日期("2014/12/25")2014 - 12 - 25 t07:00:00.000z日期

教训似乎是:如果  您将在Date构造函数中使用字符串,请确保其格式正确(根据ECMAScript标准):

YYYY-MM-DDTHH:mm:ss.sssZ
CHROME:

<>之前新日期(2014 - 12 - 25 - t00:00:00.000 07:00)2014年12月25日星期四00:00:00 GMT-0700(山区标准时间)之前FIREFOX:

<>之前新日期(2014 - 12 - 25 - t00:00:00.000 07:00)2014 - 12 - 25 t07:00:00.000z日期之前


ECMAScript标准在15.9.3.2

中说
If Type(v) is String, then
    Parse v as a date, in exactly the same manner as for the parse method (15.9.4.2);

在15.9.4.2中它说:

<>之前该函数首先尝试解析字符串的格式在日期时间字符串格式(15.9.1.15)中调用的规则。<我>字符串不符合这种格式函数可以返回到any特定于实现的启发式或特定于实现的日期格式。之前

…这对我来说,如果你不提供准确的格式,Chrome和Firefox以及其他所有人都可以按照他们认为正确的方式解释日期字符串。(注意:在格式上有一些余地,例如,不存在的SSS字段的值为"000"。