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