2014-09-25 15 views
0

我想在不改变时区的情况下将日期字符串转换为日期对象。这是标准的行为:JavaScript从字符串创建新的日期而不改变时区

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) 

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

+0

感谢zerkms,即伟大工程。我将添加它作为答案。 – Sean 2014-09-25 00:17:21

+0

'新日期('2014-10-24 00:00:00')'在Safari和Firefox中返回*无效日期*。 – RobG 2014-09-25 01:16:58

+0

你说得对。我在一个需要支持IE9的网站上使用它,并且IE不会将其视为有效的日期。 – Sean 2014-09-25 01:35:26

回答

1

做使用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使用(包括20%左右的被视为在所有浏览器仍然使用IE 8及更低版本)。

如果,另一方面,你希望字符串被当作本地时间,然后就取出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> 
0

以下是zerkms解决方案的实现。

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

结果

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

如果你想要一个在某些浏览器中被当作本地的字符串,在其他地方使用UTC,而在其他地方使用* NaN *,这是一个很好的答案。 – RobG 2014-09-25 01:05:15

+0

你说得对,它可以在Chrome浏览器中运行,但我需要一些能够全面工作的东西。谢谢。 – Sean 2014-09-25 01:36:44

相关问题