toDateString()减少我的日期

whi*_*one 7 javascript date

对于以下代码:

var d = new Date("2013-07-01");
console.log(d.toDateString());
Run Code Online (Sandbox Code Playgroud)

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

Esa*_*ija 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());
Run Code Online (Sandbox Code Playgroud)

实际存储的是什么日期?

2013-07-01 00:00:00 UTC


Mat*_*int 5

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

但一般来说,像"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"
Run Code Online (Sandbox Code Playgroud)

使用此代码,实际存储的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"
Run Code Online (Sandbox Code Playgroud)

但是此输出可能比您期望的要多,并且在各种浏览器中看起来仍然有所不同。

选项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"
Run Code Online (Sandbox Code Playgroud)

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

  • 现在有一个改进的“选项 2”: `d.toLocaleString('en-US', {timeZone: "UTC", day: "2-digit", Month: "short", Year: "numeric", weekday: “短”})`。确切的输出取决于实现,但我没有看到问题:这里是“Mon, Jul 01, 2013”​​。如果您不喜欢逗号,那么在爱尔兰他们也不喜欢它们:使用“en-IE”作为语言环境。 (3认同)