JavaScript从字符串创建新日期而不更改时区

时间:2014-09-25 00:08:47

标签: javascript date datetime

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

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

结果

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

  

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

> 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(包括仍使用IE 8及更低版本的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>

答案 1 :(得分:0)

这是zerkms解决方案的实现。

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

结果

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