gpt4 book ai didi

Javascript 转换时区问题

转载 作者:行者123 更新时间:2023-11-30 00:19:57 32 4
gpt4 key购买 nike

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

我从服务器接收到格式为“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 (强调我的)

The date time string may be in ISO 8601 format. For example, "2011-10-10" (just date) or "2011-10-10T14:48:00" (date and time) can be passed and parsed. The UTC time zone is used to interpret arguments in ISO 8601 format that do not contain time zone information (note that ECMAScript 2015 specifies that date time strings without a time zone are to be treated as local, not UTC).

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

我写了here如何利用 moment.js 或 native 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 支持的日期格式。

关于Javascript 转换时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524065/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com