JS Date()-天数的前导零

JS Date() - Leading zero on days

本文关键字:-天 Date JS      更新时间:2023-09-26

字符串中日期的前导零似乎会破坏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

为什么?有没有一个好的方法可以绕过领先的零点?

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

编辑

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

根据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开始的月份)。

无论选择哪一种,都有一种日期/时间字符串格式,所有符合规范的浏览器都应该同意。

作为替代方案,为什么不使用unix时间戳呢?在JavaScript中,您可以将时间戳值乘以1000,例如

var _t = { time: 1446220558 };
var _d = new Date( _t.time*1000 );

在浏览器控制台中测试:

new Date( 14462205581000 );
// prints Fri Oct 30 2015 11:55:58 GMT-0400 (EDT)

它也有一点好处(如果数据来自JS)-你可以在每个日期元素"2015-10-30"VS 1446220558上保存2个字节:)