iOS 时间解析 兼容性的坑

419 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,如果该字符串无法识别,或者一些情况下,包含了不合法的日期数值(如:2015-02-31),则返回值为NaN。

问题

同一行代码在不容浏览器中的效果截然不同

const date = Date.parse(new Date('2022-04-08')).

// ios 报错
// 期望效果 1649376000000

iOS中 Date.parse() 兼容性问题

ios 中使用Date.Parse() 格式需要转换为yyyy/mm/dd

const date = Date.parse(new Date('2022/04/08')).

// ios 1649376000000
// 期望效果 1649376000000

解决方法

time.replace(/-/g, "/");

引擎相关的日期格式

ECMAScript  规范规定:如果一个字符串不符合标准格式,则函数可以使用任何由引擎决定的策略或解析算法。 Date.parse()  对于因包含有无效元素而无法识别的 ISO 格式字符串或者日期应该返回 NaN 。

但是, 在如 ECMA-262 规范中定义的情况,如果因为无效值而导致日期字符串不能被识别为 ISO 格式时,根据浏览器和给定的值不同,返回值可以是,也可以不是 NaN 。比如:

// 包含无效值的非 ISO 格式字符串
new Date('23/25/2014');

在 Firefox 30 中会被识别为本地时区的2015年12月25日,而在 Safari 7 中则是无效日期。但是,如果字符串被识别为 ISO 格式并且包含无效值,则在所有遵循 ES5 或者更新标准的浏览器中都会返回 [NaN]

// 包含无效值的 ISO 格式字符串
new Date('2014-25-23').toISOString();
// 在所有遵循 ES5的浏览器中返回 "RangeError: invalid date"