Safari为ISOString()返回Date的错误值

时间:2019-02-16 18:30:04

标签: javascript google-chrome firefox safari mobile-safari

当我将日期字符串2019-02-16T10:00:00转换为时区GMT+0100 (CET)的JS Date对象,然后调用.toISOString()时,我希望获得ISO日期/时间2019-12-01T09:10:10.000Z < em>(-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问题?

2 个答案:

答案 0 :(得分:1)

似乎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"

答案 1 :(得分:0)

我发现了问题。 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

FireFox (正确)

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

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