请注意,您编写的代码的行为在浏览器之间有所不同:
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)。
很遗憾Date
JavaScript 中的对象以其怪癖和跨浏览器不一致而闻名,特别是在不明确的输入上。
I wrote here https://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time-in-javascript/33523879#33523879你如何利用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 支持的多种日期格式。