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

新手上路,请多包涵

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

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)

原文由 levi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 688
2 个回答

请注意,东部夏令时间是 -4 hours ,而您返回之日的小时数是 20

 20h + 4h = 24h

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

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

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

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

原文由 zzzzBov 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

但是,如果我们将字符串格式重新排列为 Month-Day-Year

 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)

数字、字符串参数的示例。请注意月份是三月,因为再次以零为基础的月份。

 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)

原文由 SoEzPz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题