2015-11-04 104 views
2

我在转换当前timzone中的datetime时遇到了问题。Javascript转换时区问题

我收到服务器的这个日期字符串格式为“2015-10-09T08:00:00”这是中央时间,但当我在GMT + 5中使用新日期(strDate)转换此日期时间时,它将我返回给我在下面是不正确的。

var dateObj = '2015-10-09T08:00:00'; 
new Date(dateObj); // return me below 
Fri Oct 09 2015 13:00:00 GMT+0500 (PKT) 

另一种方式我用的是加区偏移量和它的返回我正确的结果,但是当夏令激活挑衅无法转换。

dateObj2 = '2015-10-09T08:00:00'+'-06:00'; 
new Date(dateObj2)// return me below 
Fri Oct 09 2015 19:00:00 GMT+0500 (PKT) 

我很感激,如果有人帮助或建议我有效的方式来处理时区转换与夏令时在JavaScript中?

谢谢。

+0

如果你不反对使用库:http://momentjs.com/timezone/ – Manube

+0

@Manube感谢您的建议,我会尝试任何线索在纯JavaScript。 –

+1

在普通的js中,我认为这很棘手,因为你的应用需要根据时区知道夏令时;所有这些都经过深思熟虑,并由当时的时区库 – Manube

回答

1

注意代码的这种行为你写的浏览器之间的不同:

new Date('2015-10-09T08:00:00').toString() 

// "Fri Oct 09 2015 10:00:00 GMT+0200 (Romance Daylight Time)" // Chrome 46 on Windows 8.1 
// "Fri Oct 09 2015 08:00:00 GMT+0200 (Romance Daylight Time)" // Firefox 41 on Windows 8.1 
// "Fri Oct 09 2015 08:00:00 GMT+0200 (Romance Daylight Time)" // IE11 on Windows 8.1 
// "Fri Oct 9 08:00:00 UTC+0200 2015" // IE10 emulation 
// "Fri Oct 9 10:00:00 UTC+0200 2015" // IE9 emulation 
// on IE8 it even returns NaN! 

(我的时区是巴黎)

因此,Firefox和IE浏览器解释为规定就好像它是在提供的日期用户的本地时区,而Chrome将其解释为UTC,并在打印时将其转换为用户的时区。

检查MDN文档,这是由于EcmaScript 5和EcmaScript 6(2015)规格的差异。 Chrome似乎遵循ES5规范,而Firefox和IE11遵循ES6规范。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#ECMAScript_5_ISO-8601_format_support(重点煤矿)

的日期时间字符串可在ISO 8601的格式。例如, “2011-10-10”(刚刚日期)或“2011-10-10T14:48:00”(日期和时间)可以传递并解析 。 UTC时区用于解释ISO 8601格式的参数 (不包含时区信息)(注意 ECMAScript 2015指定日期时间字符串没有时间 区域将被视为本地而不是UTC)。

不幸Date对象在JavaScript是著名的怪异和跨浏览器的不一致,特别是在模糊输入。

我写here 如何利用moment.js或本地Intl API,以确保您的日期将不会被转换成用户的时区(秘密是使用UTC操作方法)。

一般来说,最好始终指定任何时间和UTC偏移,或只是一个UTC时间戳,以确保您的输入是明确的。

回来到您的例子,你可以用下面的代码:

moment('2015-10-09T08:00:00-06:00') 
.utcOffset(+300).locale('en_gb').format("LLLL") 
// "Friday, 9 October 2015 19:00" cross-browser 

中,你说:“这是迄今为止在UTC-0600,请把它转换和打印为UTC + 0500(300分钟) ”。然后,您可以传递您希望打印的语言环境(即语言+文化特定设置,例如en_gb使用24小时制,而en_us使用12小时制)并使用moment.js支持的多种日期格式。

+2

照顾。实际上,Chrome仍然遵循ES5规范,就像IE9一样。 ES6澄清未指定的偏移量意味着*本地*,以符合ISO-8601。然而,[这是积极的争议](https://github.com/tc39/ecma262/issues/87)! [目前的妥协](https://github.com/tc39/ecma262/pull/138)是只有日期仍然是UTC,而日期+时间使用本地(这仍然是疯了恕我直言),但铬有尚未采用它。 :( –

+0

@MattJohnson你是对的,我用另一种方式写东西:)修正。 –

+1

谢谢。回答良好,另请参阅Chromium问题[543320](https://code.google.com/p/chromium/issues/detail?id=543320)和[539813](https://code.google.com/p/chromium/issues/detail?id = 539813)以及[我的博文](http://codeofmatt.com/2015/06/17/javascript-date-parsing-changes-in-es6/)。 :) –