Chrome Safari为Date toISOString()返回错误的值

ibrsph3r  于 2023-04-27  发布在  Go
关注(0)|答案(2)|浏览(111)

当我将日期字符串2019-02-16T10:00:00转换为时区为GMT+0100 (CET)的JS Date对象,然后调用.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

火狐*(正确):*

new Date('2019-12-01T10:10:10').toISOString()
// returns 2019-12-01T09:10:10.000Z

是我错过了什么,还是这是一个已知的Safari问题?

kx7yvsdv

kx7yvsdv1#

我发现了这个问题。Safari无法将格式为2019-12-01T10:10:10的日期字符串转换为Date对象而不使用它。解决方案(found here)是重新格式化为所有浏览器都支持的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

火狐*(正确)*:

new Date(dateString).toISOString()
// returns 2019-12-01T09:10:10.000Z

希望这能为下一个沮丧的开发人员节省几个小时!

bwleehnv

bwleehnv2#

看起来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"

相关问题