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

4

我正在尝试使用一些简单的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

谷歌浏览器适用。
3个回答

5
你的日期格式应该是"IETF-compliant RFC 2822 timestamp",如果不是,则可能存在一些跨浏览器的不一致性。
在这里阅读更多信息:http://dygraphs.com/date-formats.html 基本上,你只需要将'-' 替换为 '/' 即可使其在任何现有浏览器上运行。

2
该规范并不要求解析日期格式为YYYY-MM-DD HH:MM:SS的日期:“new Date”:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2.
使用与parse方法相同的方式来将v解析为日期,结果与Date.parse(...)的结果基本相同。 Date.parsehttp://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2.
该函数首先尝试根据“日期时间字符串格式”(15.9.1.15节中定义的规则)解析字符串的格式。如果字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式方法或具体日期格式。在格式字符串中包含无法识别的字符串或日期格式错误的元素值会导致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);

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接