JS Date() - 天数为零

时间:2015-10-30 15:33:44

标签: javascript google-chrome date firefox

字符串中当天的前导零似乎打破了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当地时间) )。

2 个答案:

答案 0 :(得分:3)

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

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) - 你可以在每个日期元素上保存2个字节' 2015-10-30' VS 1446220558:)

答案 1 :(得分:2)

根据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)。

  3. 无论您选择哪个选项, 都是所有符合规范的浏览器都应该同意的日期/时间字符串格式。