11

对于以下代码:

var d = new Date("2013-07-01");
console.log(d.toDateString());

它输出 Sun Jun 30 2013,比输入少一天。对象怎么了?实际存储的日期是什么?

4

3 回答 3

10

日期被解析为 UTC 日期,但toDateString()输出的是本地时区的时间。

试试这个

var d = new Date(2013, 6, 1); //6 instead of 7 because the mont argument is  zero-based
console.log(d.toDateString());

实际存储的日期是什么?

2013-07-01 00:00:00 UTC

于 2013-07-31T00:28:02.887 回答
8

Date根据您使用的浏览器/运行时,从字符串解析 a可能会产生不同的结果。这里有一张图表,列出了一些浏览器及其支持的内容。

但一般来说,字符串 like"2013-07-01"被视为 UTC 的午夜。

如果你想在当地时间解析它,你可以使用"2013/07/01". 但这有点奇怪。您可能很想使用"07/01/2013",但这可能会被解释为 1 月 7 日或 7 月 1 日。其中任何一个仍然是特定于实现的。

如果您想要一个通用的“无处不在”的解决方案,您有几个不同的选择:

选项1

不要解析它。使用接受整数的构造函数。

var d = new Date(2013,6,1);    // watch out for the zero-based month
console.log(d.toDateString());

// output:  "Mon Jul 01 2013"

使用此代码,存储的实际 UTC 时间将根据您自己的时区而有所不同。但既然.toDateString()也考虑到了那个时间,那么你应该没问题。

选项 2

将其解析为 UTC,并将其显示为 UTC/GMT:

var d = new Date("2013-07-01");
console.log(d.toUTCString());

// output:  "Mon, 01 Jul 2013 00:00:00 GMT"

但是这个输出可能比你想要的要多,而且它在不同的浏览器中可能看起来仍然不同。

选项 3

使用moment.js库,您可以在其中精确控制所需的格式。

var m = moment("2013-07-01", "YYYY-MM-DD");  // explicit input format
console.log(m.format("ddd MMM DD YYYY"));    // explicit output format

// output:  "Mon Jul 01 2013"

恕我直言,这是最好的解决方案。但这确实需要您使用库。

于 2013-07-31T01:07:32.897 回答
4

选项 4

这种方法效果很好,不需要 3rd 方库。

    var parts ='2013-07-01'.split('-');
    var mydate = new Date(Date.UTC(parts[0],parts[1]-1,parts[2])); //please put attention to the month
于 2014-04-04T05:19:34.730 回答