本文完整阅读约需 4 分钟,如时间较长请考虑收藏后慢慢阅读~

iOS中的WebView默认为Safari,而大量iOS用户也有使用Safari浏览器进行网页浏览的习惯,然而,Safari浏览器对于某些JavaScript对象的解析与常用的Chrome、Firefox、IE、Edge等有很大不同,稍不注意就容易掉坑里去,导致很多不必要的麻烦。

我们经常会使用到JavaScript的时间转换对象Date,常用的操作如下:
var time = new Date("2018-02-05T21:02") / 1000;
//除1000的目的是消除毫秒,同时将Date对象强制转换为时间戳

然而由于浏览器的不同,这一段代码在Chrome等主流浏览器中以及iOS的Safari中有者显著的区别:
– 在Chrome中,执行console.log(time)之后,我们得到这个时间字符串的对应时间戳1517835720
– 在iOS的Safari中,执行alert(time)之后,我们只得到NaN的提示

这里的NaN指的是Not a Number,也就是非数字。

很显然这个函数在iOS平台的Safari下没有被正确解析。

查阅资料得知,iOS的Safari解析的时间字符串只能形如2018/02/05 21:02,因此需要对其进行转换,转换函数如下:

function formatTimeStr (timeStr) {
    timeStr = timeStr.replace(/\-/g, "/").replace(/T/g, " ");       //先后将-转换为/,将T转换为空格
    return timeStr;
}

问题随之得解,形如 2018/02/05 21:02的时间字符串能够被绝大多数主流浏览器解析,因此不会出现兼容性问题,如果担心(或者确实发生)有兼容性问题,可以对浏览器的UA进行判断(也可以直接捕获是否为NaN然后进行判断),针对Safari专门进行转换。

在前端中,如果input控件的type参数设置为date,我们直接获取这个控件的值,得到的是类似于2018-02-05T21:02的字符串,却没想到无法直接使用,在这儿,直觉是错误的,因此要多多注意,不要重复犯错。