为什么JavaScript会给我的约会增加5个小时?

为什么JavaScript会给我的约会增加5个小时?,javascript,Javascript,我有一个datetime字符串,想创建一个JS日期对象: var dt_string = "2/10/2018 11:52:41 PM"; var d_object = new Date(dt_string); 我想以不同的格式打印日期/时间(恰好与ISO字符串匹配): 我希望看到: "2018-02-10 23:52:41" 相反,我得到的是: "2018-02-11 04:52:41" 比预期晚了5个小时。调试后,我发现: new Date(d_string): Sat Feb 10

我有一个datetime字符串,想创建一个JS日期对象:

var dt_string = "2/10/2018 11:52:41 PM";
var d_object = new Date(dt_string);
我想以不同的格式打印日期/时间(恰好与ISO字符串匹配):

我希望看到:

"2018-02-10 23:52:41"
相反,我得到的是:

"2018-02-11 04:52:41"
比预期晚了5个小时。调试后,我发现:

new Date(d_string): Sat Feb 10 2018 23:52:41 GMT-0500 (Eastern Standard Time)

这让我觉得我的时间比格林尼治标准时间多了5个小时。我如何让JS尊重我的原始时间,而不改变它?

假设每个
日期
对象的时区都是本地机器的时区:UTC-05

由于
toISOString()
返回一个零UTC偏移量日期(以字符串的形式),因此您将获得5小时的添加时间

请注意,
Date
对象在内部不存储任何时区信息

为了回答您的问题:

我如何让JS尊重我原来的时间,而不改变它

如果“原始时间”是零UTC偏移量,则可以在传递给
日期
构造函数的字符串中指定:

var dt_string = "2/10/2018 11:52:41 PM UTC+0000";
//                                     ^^^^^^^^
var d_object = new Date(dt_string);
现在,如果您评估:

console.log("date/time: " + d_object.toISOString().substring(0,10) + " " + d_object.toISOString().substring(11,19));
你会得到:

"date/time: 2018-02-10 23:52:41"

请注意,根据之前编写的内容,如果您检查
d_对象
,您将得到解析后的日期转换为您的本地时区。

首先,您应该简化生活并安装

然而,正如评论所建议的,
toISOString
使用UTC表单

如果你真的关心在你的时区打印

下面是对其中一个答案的操作,以打印您想要的内容。绝对不是理想的方法

var dt_string=“2/10/2018 11:52:41 PM”; var d_对象=新日期(dt_字符串); console.log(d_对象); d_object.setTime(d_object.getTime()-d_object.getTimezoneOffset()*60*1000);
console.log(d_对象)new Date解析日期,假设它是本地的,但是
toISOString
以ISO8601格式返回它,该格式为UTC/“Zulu”(因此后面的
Z
)。坦率地说,你很幸运,你提供的日期显然是在2018年10月,而不是2月
toISOString()
outputs UTC date-如果您没有切掉其中的一些内容,您会看到我更新了我的答案,为您的问题提供了一个简单的解决方案,并解释了您观察到的行为。希望它能帮助我找到答案。对于我的情况,我需要添加时区,如:d_object.setTime(d_object.getTime()+d_object.getTimezoneOffset()*60*1000);console.log(d_对象);
"date/time: 2018-02-10 23:52:41"