JS Date() - 天数前导零

Sip*_*hon 3 javascript firefox google-chrome date

字符串中一天的前导零似乎会破坏 Chrome 中的 Javascript Date 对象。浏览器之间也存在一些不一致,因为 Firefox 正确处理前导零,但在不包含零时失败。看这个例子:https : //jsfiddle.net/3m6ovh1f/3/

Date('2015-11-01'); // works in Firefox, not in Chrome

Date('2015-11-1'); // works in Chrome, not in Firefox

为什么?有没有解决/使用前导零的好方法?

请注意,字符串通过 AJAX 来自 MySQL,所有日期都将包含前导零,我可以通过格式化服务器端的日期来解决这个问题。什么格式效果最好?

编辑

只是为了说明我的问题是什么,看起来 Chrome 正在对YYYY-MM-DD格式应用时区,这将 11 月 1 日的日期恢复为 10 月 31 日的日期(因为我的 EDT 当地时间)。

hic*_*123 5

根据ECMA-262 (5.1)

该函数首先尝试根据日期时间字符串格式 (15.9.1.15) 中规定的规则解析字符串的格式。如果字符串不符合该格式,该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。

15.9.1.15 中描述的日期/时间字符串格式是YYYY-MM-DDTHH:mm:ss.sssZ. 它也可以是这种格式的较短表示,例如YYYY-MM-DD.

2015-11-1不是为Javascript(注意这是一个有效的日期/时间字符串YYYY-MM-D,而不是YYYY-MM-DD)。因此,实现(浏览器)能够对该字符串做任何它想做的事情。它可以尝试以不同的格式解析字符串,或者它可以简单地说该字符串是一个无效的日期。Chrome 选择前者(请参阅DateParser::Parse参考资料)并尝试将其解析为“遗留”日期。Firefox 似乎选择了后者,并且拒绝解析它。

现在,您声称new Date('2015-11-01')在 Chrome中不起作用的说法是不正确的。由于字符串符合日期/时间字符串格式,Chrome必须对其进行解析以符合规范。事实上,我只是自己尝试过——它在 Chrome 中有效。

那么,你有什么选择呢?

  1. 使用正确的日期/时间格式(即YYYY-MM-DD或它的一些扩展)。

  2. 在这种情况下使用new Date (year, month, date)构造函数,即new Date(2015, 10, 1)(月份从 0 到 11)。

哪个选项是你的,但有一个日期/时间字符串格式,所有的规格兼容的浏览器应该同意。