Javascript 日期对象总是休息一天吗?

2022-08-29 23:39:45

在我的Java脚本应用程序中,我以如下格式存储日期:

2011-09-24

现在,当我尝试使用上述值创建新的 Date 对象(以便我可以以不同的格式检索日期)时,日期总是会回来一天。见下文:

var date = new Date("2011-09-24");
console.log(date);

原木:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)

答案 1

转换字符串的JS DATE对象会发生一些疯狂的事情,例如考虑您提供的以下日期

注意:以下示例可能会或可能不会关闭一天,具体取决于您的时区和当前时间。

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

但是,如果我们将字符串格式重新排列为月-日-年...

new Date("09-24-2011");
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

另一个奇怪的

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

在创建新日期时,我们可以轻松地更改日期“2011-09-24”中的连字符

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

如果我们有一个日期字符串,如“2011-09-24T00:00:00”,该怎么办?

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

现在将连字符更改为像以前一样正斜杠;会发生什么情况?

new Date("2011/09/24T00:00:00");
// => Invalid Date.

我通常必须管理日期格式 2011-09-24T00:00:00,这就是我所做的。

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

更新

如果向 Date 构造函数提供单独的参数,则可以获取其他有用的输出,如下所述

注意:参数可以是“数字”或“字符串”类型。我将展示具有混合值的示例。

获取给定年份的第一个月和某一天

new Date(2011, 0); // Normal behavior as months in this case are zero based.
// => Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

获取一年中的最后一个月和某一天

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
// => Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

数字、字符串参数的示例。请注意,该月是 3 月,因为再次基于零的月份。

new Date(2011, "02"); 
// => Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

如果我们做同样的事情,但有一天是零,我们会得到不同的东西。

new Date(2011, "02", 0); // Again the zero roles back from March to the last day of February.
// => Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

将零日添加到任何年和月参数将得到上个月的最后一天。如果继续使用负数,则可以在改天继续回滚

new Date(2011, "02", -1);
// => Sun Feb 27 2011 00:00:00 GMT-0700 (MST)

答案 2

请注意,东部夏令时是,您返回的日期的小时数是 。-4 hours20

20h + 4h = 24h

这是2011-09-24的午夜。日期是以 UTC (GMT) 格式解析的,因为您提供了一个仅包含日期的字符串,没有任何时区指示器。如果您为日期/时间字符串指定了一个没有指示器的标记(),它将以本地时区进行解析。(从历史上看,那里一直存在不一致之处,尤其是因为规范更改了不止一次,但现代浏览器应该没问题;或者您可以随时包含时区指示器。new Date("2011-09-24T00:00:00")

你得到了正确的日期,你只是从来没有指定过正确的时区。

如果需要访问日期值,可以使用或任何其他 getUTC*() 函数getUTCDate()

var d,
  days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);