Safari 为 Date toISOString() 返回了不正确的值

Posted

技术标签:

【中文标题】Safari 为 Date toISOString() 返回了不正确的值【英文标题】:Safari returns incorrect value for Date toISOString() 【发布时间】:2019-02-16 18:30:04 【问题描述】:

当我将日期字符串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

FireFox (正确):

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

我是否遗漏了什么,或者这是一个已知的 Safari 问题?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Safari 为 Date toISOString() 返回了不正确的值的主要内容,如果未能解决你的问题,请参考以下文章

javascript toISOString()忽略时区偏移量

tomorrow - 明天

TypeError:formats.dateTimeString.toISOString 不是函数

javascript toISOString() 忽略时区偏移

检查日期字符串是否为ISO和UTC格式

.toISOString() 函数的问题