Javascript转换时区问题

时间:2015-11-04 14:13:16

标签: javascript datetime timezone

我在转换当前时区的日期时遇到问题。

我从服务器收到这个日期字符串的格式为" 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进行夏令时处理时区转换的有效方法吗?

谢谢。

1 个答案:

答案 0 :(得分: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和IE11似乎遵循ES5规范。

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)。

不幸的是,JavaScript中的Date对象因其怪癖和跨浏览器的不一致而闻名,特别是在模糊输入方面。

我写了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小时制),并使用大量支持的日期格式。 JS。