在我的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)

当前回答

您可以通过将此日期转换为UTC日期

new Date(Date.UTC(Year, Month, Day, Hour, Minute, Second))

并且总是建议使用UTC(通用时区)日期,而不是使用本地时间的日期,因为默认情况下,日期以UTC存储在数据库中。因此,在整个项目中使用和解释UTC格式的日期是一个很好的实践。 例如,

Date.getUTCYear(), getUTCMonth(), getUTCDay(), getUTCHours()

因此,使用UTC日期解决了所有与时区相关的问题。

其他回答

如果希望获得本地时区某个日期的0小时,请将各个日期部分传递给date构造函数。

new Date(2011,08,24); // month value is 0 based, others are 1 based.

你的问题是时区。注意GMT-0400部分,也就是你比GMT晚4个小时。如果在显示的日期/时间上加上4个小时,就会得到2011/09/24的零点。使用toUTCString()方法来获取GMT字符串:

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

试着在这个帖子中添加我的2分(详细说明@paul-wintz的答案)。

在我看来,当日期构造函数接收到匹配ISO 8601格式(日期部分)的第一部分的字符串时,它会在UTC时区与0时间进行精确的日期转换。当该日期转换为当地时间时,可能会发生日期移位 如果午夜UTC是本地时区的较早日期。

new Date('2020-05-07')
Wed May 06 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

如果日期字符串是任何其他“松散”格式(使用“/”或日期/月不填充为零),则在本地时区创建日期,因此没有日期转移问题。

new Date('2020/05/07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-05-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

因此,如上所述,一个快速修复方法是将ISO格式的Date字符串中的“-”替换为“/”。

new Date('2020-05-07'.replace('-','/'))
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

我只是想就这个问题发表我的意见,因为这篇文章对解决这个问题非常有帮助。我想我没见过这个解决方案,如果我说错了请指正。

正如这里已经提到过无数次的那样,问题主要来自夏季/冬季时间。我注意到1月份的GMT是+1。如果没有设置时间,它将始终是00.00.00(午夜),这将导致前一天的第23小时。

如果您有一个动态日期并且不关心小时,您可以在使用toISOString()之前使用setHours()方法设置小时。

语法: setHours(hoursValue, minutesValue, secondsValue, msValue)

这意味着:

dynamicDate.setHours(12, 0, 0, 0)
dynamicDate.toISOString()

应该希望为您工作,即使日期提前/后一个小时,它仍然是同一天,现在我们将时间设置为中午。

更多关于MDN上的setHours()。

如果你需要一个简单的解决方案,请参阅:

new Date('1993-01-20'.split('-'));