当我将日期字符串2019-02-16T10:00:00
转换为时区GMT+0100 (CET)
中的JS日期对象时,然后致电.toISOString()
,我希望获得ISO日期/时间 2019-12-01T09:10:10.000Z
( - 1小时)。
但是,我看到的是:
Safari (不正确):
new Date('2019-12-01T10:10:10').toISOString()
// returns 2019-12-01T10:10:10.000Z
chrome (正确):
new Date('2019-12-01T10:10:10').toISOString()
// returns 2019-12-01T09:10:10.000Z
firefox (正确):
new Date('2019-12-01T10:10:10').toISOString()
// returns 2019-12-01T09:10:10.000Z
我错过了什么,还是这是一个已知的野生动物园问题?
我发现了问题。Safari无法在不拧紧的情况下将2019-12-01T10:10:10
格式的日期字符串转换为Date
对象。解决方案(此处找到)是将所有浏览器支持的2019/12/01 10:10:10
重新格式化。
// convert into YYYY/MM/DD HH:MM:SS
var dateString = '2019-12-01T10:10:10'.replace(/-/g, '/').replace('T', ' ');
Safari (正确):
new Date(dateString).toISOString()
// returns 2019-12-01T09:10:10.000Z
chrome (正确):
new Date(dateString).toISOString()
// returns 2019-12-01T09:10:10.000Z
firefox (正确):
new Date(dateString).toISOString()
// returns 2019-12-01T09:10:10.000Z
希望这能节省下一个沮丧的开发人员几个小时!
看起来Safari将提供的输入时间作为UTC的时间,但是Chrome和Firefox正在使用本地时区。我找不到任何支持这种行为的官方文件。但是您可以轻松地从浏览器验证它。这是我在印度的(GMT+530)
的输出。
Chrome/FF:
new Date('2019-12-01T10:10:10Z').toISOString()
"2019-12-01T10:10:10.000Z"
new Date('2019-12-01T10:10:10').toISOString()
"2019-12-01T04:40:10.000Z"
Safari:
new Date('2019-12-01T10:10:10').toISOString()
"2019-12-01T10:10:10.000Z"
new Date('2019-12-01T10:10:10Z').toISOString()
"2019-12-01T10:10:10.000Z"