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

bar*_*lop 7 javascript datetime iso

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

在 Date 对象中的 2 月 31 天检查了这个问题

但是那里的答案表明他的问题中 Date 没有任何问题。有人对提问者说了一些关于零索引的问题,他几乎说“哦,好吧”,并确定这是他的错误而不是 Date 的错误。

另一个问题Date 正在考虑一个月中31 天,这个人正在做一些减法是一些代码行,他似乎最终没有把错误归结为 Date。

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

Date.parse 知道一个月没有 32 天,那很好

Date.parse("2000-01-32");
NaN
Run Code Online (Sandbox Code Playgroud)

但在二月它认为可以有 30 或 31 天

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

Date.parse("2013-02-31");
1362268800000
Run Code Online (Sandbox Code Playgroud)

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

这里没有零索引的问题。由于 Date.parse("...") 不使用零索引(即使使用了零索引,也不会误以为二月有 31 天——这不仅仅是一次!

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

Date.parse("00-01-2000");
NaN
Run Code Online (Sandbox Code Playgroud)

Bla*_*ole 3

根据(强调我的)规范Date.parse()

\n\n
\n

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

\n
\n\n

并根据日期时间字符串格式规范(强调我的):

\n\n
\n

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

\n\n

其中字段如下: [\xe2\x80\xa6]是从 01 到 31 的DD月份中的第几天。

\n
\n\n

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

\n\n

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

\n