Javascript转换时区问题

2024-06-20

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

我从服务器收到此日期字符串,格式为“2015-10-09T08:00:00”,这是中部时间,但是当我使用 GMT+5 中的 new Date(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 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)。

很遗憾DateJavaScript 中的对象以其怪癖和跨浏览器不一致而闻名,特别是在不明确的输入上。

I wrote here https://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time-in-javascript/33523879#33523879你如何利用moment.js或本机IntlAPI 确保您的日期不会转换为用户的时区(秘密是使用 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_us12 小时制)并使用 moment.js 支持的多种日期格式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript转换时区问题 的相关文章

随机推荐