Date.parse()方法在安卓和苹果手机上的不同表现

经过手动测试得知:

  • 安卓手机:会正常返回毫秒数,只要是符合要求的时间字符串即可,要求比较宽松。
  • 苹果手机:会返回NaN。形如2018-07-24 23:17:43的时间字符串的格式不被支持,不符合标准。

    经过查阅资料得知:

  1. 语法:
    //显式调用
    Date.parse(dateString)
    //隐式调用
    new Date(dateString)
    /** 参数:dateString
    *  一个符合 RFC2822 或 ISO 8601 日期格式的字符串(其他格式也许也支持,但结果可能与预期不符)。
    *  返回值:
    *  一个表示从1970-1-1 00:00:00 UTC到给定日期字符串所表示时间的毫秒数的数值。
    *  注:如果参数不能解析为一个有效的日期,则返回NaN
  2. */

描述:

  • Date.parse() 方法接受一个表示时间的字符串,返回相应的时间值。
  • 如果传入Date.parse()方法的参数不能解析为一个有效的日期,则返回NaN。
  • 如果该时间字符串无法识别,或者一些情况下,包含了不合法的日期数值(如:2015-02-31),则返回值为NaN。
  • 字符串的解析完全取决于实现。直到至今,不同宿主(指各大浏览器厂商)在如何解析日期字符串上仍存在许多差异。
  • 由于在解析日期字符串时存在偏差会导致结果不一致,因此推荐始终手动解析日期字符串。
  1. 引擎相关日期:
  • ECMAScript 规范规定:如果一个字符串不符合标准格式,则函数可以使用任何由引擎决定的策略或解析算法。
  • Date.parse() 对于因包含有无效元素而无法识别的 ISO 格式字符串或者日期,应该返回NaN。
  • 在如 ECMA-262 规范中定义的情况,如果因为无效值而导致日期字符串不能被识别为ISO 格式时,根据浏览器和给定的值不同,返回值可以是,也可以不是 NaN。
  • 如果字符串被识别为 ISO格式并且包含无效值,则在所有遵循 ES5 或者更新标准的浏览器中都会返回 NaN 。

解决问题

兼容性提示:为了避免任何可能的同步问题或者有歧义的年份,推荐使用 ISO 8601 格式如 “2017-04-16”。
ECMAScript 5 ISO-8601 日期格式支持

  • 日期时间字符串也可以使用 ISO 8601格式。
  • 例如,”2011-10-10” (仅日期) 或 “2011-10-10T14:48:00” (日期和时间)能够作为参数被传递和解析。
  • 如果参数字符串只包含日期格式,那么将会使用UTC时区来解析该参数。
  • 而如果是ISO 8601 格式中规定的时间加日期的格式,则将会被作为本地时区处理。
    //时间转换方法(改进后的)
    function transformTime(t){
      //注意:苹果手机不支持以“-”分割的时间形式,故必须进行格式转换。
      var time = t.replace(/-/g,"/");
      return Date.parse(time);
    }

 上一篇
iOS safari 后退 js 不执行的问题 iOS safari 后退 js 不执行的问题
今天偶遇一个问题:iOS 10 safari 浏览器中,后退后,页面 js 没有运行。之前也遇到过这个问题,因为加入风控的代码,就好了。就没有深究。这次发现,风控的代码不好使了��。也可能是这次 iOS 版本问题,之前没有测试过 iOS 1
下一篇 
visibilitychange事件判断当前页面——可见性的状态 visibilitychange事件判断当前页面——可见性的状态
document.hidden这个新出现的document.hidden属性,它显示页面是否为用户当前观看的页面,值为ture或false。 document.visibilityStatevisibilityState的值要么是visib
  目录