为什么使用新 Date() 时给定日期会变成前一天

Why a given date turns into a day before when using new Date()?

本文关键字:日期 前一天 Date 为什么      更新时间:2023-09-26

给定的日期是2016-02-04 .那应该是2016年2月4日。但是当我使用 new Date() 时,它返回为 Wed Feb 03 2016 16:00:00 GMT-0800 (PST) 而不是 Thu Feb 04...

以下是我所做的一切:

var _entryDate = new Date("2016-02-04");
console.log(_entryDate); // Wed Feb 03 2016 16:00:00 GMT-0800 (PST)

为什么会发生这种情况,我如何获得我想要的结果,即 2 月 4 日而不是前一天?

您使用

的格式被解释为 UTC 日期,因此假定西欧的时间是午夜。 这比你提前了 8 个小时。

您可以通过将T00:00-0800附加到日期字符串来强制解释时区。对于您来说,自己分析日期并使用数字年、月和日期参数构造 Date 实例可能更可靠。

var dateArray = "2016-02-04".split("-");
var year = dateArray[0];
var month = parseInt(dateArray[1], 10) - 1;
var date = dateArray[2];
var _entryDate = new Date(year, month, date);
alert(_entryDate);

按照@RobG的建议删除了不必要的monthyear parseInt

而且我不知道 Pointy 指向什么(如无知)。我从不 已知日期构造函数将回退到 UTC,具体取决于 字符串已传递。 这样,Date 构造函数将始终使用本地时区构建 Date。 无论如何,使用带有数字参数的日期构造函数总是好的。

Javascript Date对象也包含时间。如果创建一个没有时间组件的,则默认为午夜。

问题是,午夜在哪个时区? 如果要从字符串中解析日期,则在 ECMAScript 定义中未指定该字符串;这取决于实施。但大多数实现选择世界时 - 这意味着所表示的时刻落在伦敦以西和国际日期变更线以东的任何位置的前一天。

如果您从数字创建日期而不是解析字符串,则将其指定为本地时间,无论 Javascript 认为它位于哪个时区。 例如,在美国/东部("EST")中:

new Date('2016-02-04')
//=> Wed Feb 03 2016 19:00:00 GMT-0500 (EST)  - midnight UTC
new Date(2016,2,4)
//=> Fri Mar 04 2016 00:00:00 GMT-0500 (EST)  - midnight EST

您可以在字符串末尾添加明确的时间和时区:

new Date('2016-02-04T00:00:00-05:00')

但是您必须知道时区偏移量才能做到这一点。 或者,您可以手动分析字符串并使用数字构造函数,这可能是您最安全的选择。

这是因为日期以 UTC 格式存储(和解析),但以本地时区显示。要显示正确的日期,您可以使用

new Date("2016-02-04").toISOString()