Javascript转换时区问题

Javascript convert timezone issue

本文关键字:问题 时区 转换 Javascript      更新时间:2023-09-26

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

我从服务器收到此日期字符串,格式为"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进行夏时制时区转换的有效方法,我将不胜感激?

谢谢。

请注意,您编写的代码的行为在浏览器之间有所不同:

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)

不幸的是,JavaScript中的Date对象以其怪癖和跨浏览器不一致而闻名,尤其是在不明确的输入上。

我在这里写的如何利用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支持的多种日期格式。