为什么这个Javascript在Firefox中不起作用?

时间:2013-09-29 00:58:17

标签: javascript date

我试图用一些简单的Javascript来操纵日期。代码如下:

var newDate = new Date("2013-07-23" + " 12:00:00");
console.log(newDate.toString());
newDate = new Date(newDate.getTime() - (24 * 60 * 60 * 1000));
console.log(newDate.toString());
var date = newDate.getFullYear() + "-" + ("0" + (newDate.getMonth() + 1)).slice(-2) + "-" + ("0" + newDate.getDate()).slice(-2);
console.log(date);

基本上,我正在转换

2013-07-23 -> Jul 22 2013 12:00:00 GMT+1000 -> 2013-07-22

它在Chrome中运行良好,您可以通过此Fiddle测试代码。它总是返回

"Invalid Date"
"Invalid Date"
"NaN-aN-aN"

对于Firefox中的三个console.logs,但是:

Tue Jul 23 2013 12:00:00 GMT+1000 (E. Australia Standard Time)
Mon Jul 22 2013 12:00:00 GMT+1000 (E. Australia Standard Time) 
2013-07-22

适用于Chrome。

3 个答案:

答案 0 :(得分:5)

您的日期格式应为“符合IETF标准的RFC 2822时间戳”,如果不是,则存在一些跨浏览器的不一致。

在此处阅读:http://dygraphs.com/date-formats.html

但基本上 - 您应该将“-”替换为“/”,以使其适用于任何现有的浏览器

答案 1 :(得分:2)

规范不要求解析日期格式YYYY-MM-DD HH:MM:SS

new Datehttp://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

  

将v解析为日期,其方式与解析方法完全相同

(基本上与Date.parse(...)相同的结果)

Date.parsehttp://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

  

该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调出的规则解析字符串的格式。如果String不符合该格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的日期格式。无法识别字符串或包含格式为String的非法元素值的日期将导致Date.parse返回NaN。

日期时间字符串格式:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

  

格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

无法保证任何其他格式,包括YYYY-MM-DD HH:MM:SS

您始终可以构建符合日期的字符串:

var newDate = new Date("2013-07-23" + "T12:00:00.000Z");
console.log(newDate.toString());
newDate = new Date(newDate.getTime() - (24 * 60 * 60 * 1000));
console.log(newDate.toString());
var date = newDate.getFullYear() + "-" + ("0" + (newDate.getMonth() + 1)).slice(-2) + "-" + ("0" + newDate.getDate()).slice(-2);
console.log(date);

答案 2 :(得分:0)

在Firefox中:

new Date("2013-07-23 12:00:00").toString()   // Invalid
new Date("2013-07-23T12:00:00").toString()   // Local noon
new Date("2013-07-23T12:00:00Z").toString()  // UTC noon
new Date("2013/07/23 12:00:00").toString()   // Local noon

在Chrome中:

new Date("2013-07-23 12:00:00").toString()   // Local noon
new Date("2013-07-23T12:00:00").toString()   // UTC noon
new Date("2013-07-23T12:00:00Z").toString()  // UTC noon
new Date("2013/07/23 12:00:00").toString()   // Local noon

还有许多其他不一致之处。例如,Chrome本身甚至不一致:

new Date("2013-07-23 00:00:00").toString()   // Local midnight
new Date("2013-07-23").toString()            // UTC midnight

如果您需要以一致方式解析字符串中的日期,则应考虑使用moment.js等库。

moment("2013-07-23 12:00:00", "YYYY-MM-DD HH:mm:ss").format()     // Local noon
moment.utc("2013-07-23 12:00:00", "YYYY-MM-DD HH:mm:ss").format() // UTC noon

主要优点是您可以控制输入和输出格式,并且它在所有浏览器中的工作方式相同。