javascript Date.parse假设2月和所有月份都有31天?

时间:2015-08-29 10:20:35

标签: javascript datetime iso

在我看来,Date.parse假设所有月份都有31天。包括30天和2月的月份(应该只有28/29天)。

我查看了这个问题31 days in February in Date object

但是那里的答案表明,在他的问题中,Date没有任何问题。有人向提问者说了零索引,他几乎说“哦确定”,并且确定这是他的错误而不是错误的日期。

另一个问题Date is considering 31 days of month这个家伙正在进行一些减法操作是一些代码行,他似乎并没有把错误归结为日期。

但是我的这个例子似乎有点不同而且更清晰。它涉及Date.parse,可以使用一行/两行代码进行演示。

Date.parse意识到一个月内没有32天,这很好

Date.parse("2000-01-32");
NaN

但在2月它认为可能有30或31天

Date.parse("2013-02-30");
1362182400000

Date.parse("2013-02-31");
1362268800000

事实上,它似乎认为所有月份都有31天。对于一个用于解析日期的方法来说,这真的很奇怪。

这里没有零索引的问题。由于Date.parse(“...”)不使用零索引(即使它确实如此,它也不会导致它错误地认为2月份有31天 - 这不止一个!

Date.parse("01-00-2000");
NaN

Date.parse("00-01-2000");
NaN

2 个答案:

答案 0 :(得分:2)

根据the specification for Date.parse()(强调我的):

  

该函数首先尝试根据日期时间字符串格式中调出的规则解析String的格式。 [...]无法识别的字符串或包含格式为String 的非法元素值的日期将导致Date.parse返回NaN

根据the specification for Date Time String Format(强调我的):

  

ECMAScript根据ISO 8601扩展格式的简化为日期时间定义字符串交换格式。格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

     

字段如下:[...] DD从01到31 的那一天。

因此,任何月份大于31的日期都是非法的,Date.parse()会返回NaN

请注意,标准定义了日期格式,而不是日期:静态方法不需要进行其他验证,其他所有内容都是特定于实现的。例如,Date.parse('2013-02-30')Date.parse('2013-04-31')都会在Firefox上返回NaN

答案 1 :(得分:2)

浏览器的实现方式不同。 IE,Edge和Chrome将解析不代表实际日期的字符串,但Firefox将为这些字符串返回NaN。安全的做法是将Date.parse的结果视为未定义的日期字符串,其中日期超出了月份的范围。

允许解析不存在的日期的浏览器将返回不同的日期。解析"2015-04-31"将返回日期2015-05-01。这与使用new Date(2015, 3, 31)时的行为相同,其中允许超出范围的数字并且将环绕到不同的月份或年份。这意味着如果您不介意某些无效日期在某些浏览器中转换为其他日期,则结果仍然可用。

The standard不清楚哪些值有效:

  

格式中的非法值(越界以及语法错误)   string表示格式字符串不是此的有效实例   格式。

日期组件的定义范围为1到31:

  

DD是从01到31的月份。

但是,格式基于ISO 8601,这不是将字符串解析为日期的格式,这是一种将日期表示为字符串的格式。显然,你不能代表一个甚至不作为字符串存在的日期。