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"

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

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

对于铬。

4

3 回答 3

5

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

在这里阅读:http: //dygraphs.com/date-formats.html

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

于 2013-09-29T01:02:02.130 回答
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.parse: http: //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);
于 2013-09-29T01:10:18.643 回答
0

在火狐中:

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

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

于 2013-09-29T01:20:19.383 回答