JavaScript在不更改时区的情况下从字符串创建新日期

JavaScript creating new Date from a string without changing timezone

本文关键字:新日期 创建 字符串 日期 情况下 时区 JavaScript      更新时间:2023-09-26

我试图在不更改时区的情况下将日期字符串转换为日期对象。以下是标准行为:

new Date ("2014-10-24T00:00:00")

结果

Thu Oct 23 2014 19:00:00 GMT-0500 (Central Daylight Time)

我可以通过获得以分钟为单位的偏移量,将其乘以60000,然后将其添加到新的字符串日期中来反转时区。

new Date(new Date("2014-10-24T00:00:00").getTime() + new Date().getTimezoneOffset()*60000)

这是可行的,但似乎必须有一种更好的方法,不需要创建三个日期对象。

不要使用Date构造函数解析字符串。它调用Date.parse,尽管它在ES5中被标准化为ISO8601字符串的一个版本,但它仍然几乎完全依赖于实现。

我正在尝试在不更改时区的情况下将日期字符串转换为日期对象。

> new Date ("2014-10-24T00:00:00")

该字符串在不同的浏览器中会有不同的处理方式。如果你想将其视为UTC,那么解析自己很简单:

function parseISOAsUTC(s) {  
  var b = s.split(/'D/);
  return new Date(Date.UTC(b[0],--b[1],b[2],b[3],b[4],b[5],(b[6]||0)));
}
console.log(parseISOAsUTC('2014-10-24T00:00:00').toISOString()); // 2014-10-24T00:00:00.000Z

现在您可以确定,在所有使用中的浏览器中,该字符串都将被视为UTC(包括仍在使用IE8及更低版本的20%左右的浏览器)。

另一方面,如果您希望字符串被视为本地时间,那么只需删除Date.UTC部分:

function parseISOAsLocal(s) {  
  var b = s.split(/'D/);
  return new Date(b[0],--b[1],b[2],b[3],b[4],b[5],(b[6]||0));
}
console.log(parseISOAsLocal('2014-10-24T00:00:00')); // Fri 24 Oct 2014 00:00:00 <local timezone>

这里是zerkms解决方案的一个实现。

new Date("2014-10-24T00:00:00".replace('T', ' '))

结果

Fri Oct 24 2014 00:00:00 GMT-0500 (Central Daylight Time)