zoukankan      html  css  js  c++  java
  • Safari中的new Date()格式化坑

    今天在测试的时候发现,在Chrome中的如下代码:

    new Date("2014-03-09");

    在Safari中报错invalid date。经过查阅资料找到类似的问答:

    stackOverflow地址:http://stackoverflow.com/questions/4310953/invalid-date-in-safari

    解释与翻译如下:

    目前Safari可以支持的标准格式如下:

    • MM-dd-yyyy
    • yyyy/MM/dd
    • MM/dd/yyyy
    • MMMM dd, yyyy
    • MMM dd, yyyy

     DateJS 是一个很好的格式化非标准格式日期的库。

    关于Date日期标准,原文截取 ECMA-262 standard 内容进行说明,引文如下:

    ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 Extended Format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ Where the fields are as follows:

    ECMAScript为基于ISO 8601扩展格式的日期时间定义了一个字符串交换格式。格式为YYYY-MM-DDTHH:mm:ss.sssZ,每个域的介绍如下:

    • YYYY is the decimal digits of the year in the Gregorian calendar. YYYY为格林威治时间年的十进制表达
    • ":" (hyphon) appears literally twice in the string. ":"字面上出现在两个字符串之间
    • MM is the month of the year from 01 (January) to 12 (December). MM表示月份从01(一月)到12(十二月)
    • DD is the day of the month from 01 to 31. DD表示月份中的天数从01到31.
    • T "T" appears literally in the string, to indicate the beginning of the time element. T字面上出现在字符串中,表明时间元素的开始
    • HH is the number of complete hours that have passed since midnight as two decimal digits. HH表示从午夜算起,已经经过的完整两位小时数字
    • : ":" (colon) appears literally twice in the string. ":"字面上出现在两个字符串之间
    • mm is the number of complete minutes since the start of the hour as two decimal digits. mm表示从一个小时的开始算起,已经经过的完整两位分钟数字
    • ss is the number of complete seconds since the start of the minute as two decimal digits. ss表示从一分钟的开始算起,已经经过的完整两位秒数数字
    • . "." (dot) appears literally in the string. "."字面上出现在字符串里
    • sss is the number of complete milliseconds since the start of the second as three decimal digits. Both the "." and the milliseconds field may be omitted.  sss表示从一秒钟的开始算起,已经经过的完整毫秒数,用三位数表示。该域可忽略不写。
    • Z is the time zone offset specified as "Z" (for UTC) or either "+" or "-" followed by a time expression hh:mm Z特指时区偏移(特指UTC)或使用跟随有时间表达式hh:mm 的"+"、"-"。如 +hh:mm

    This format includes date-only forms: 这种格式可以只有日期,仅允许以下格式:

    • YYYY
    • YYYY-MM
    • YYYY-MM-DD

    It also includes time-only forms with an optional time zone offset appended: 这种格式也可以只有时间,仅允许以下格式:

    • THH:mm
    • THH:mm:ss
    • THH:mm:ss.sss

    Also included are "date-times" which may be any combination of the above. 同时也可以包含以上提到的日期或时间的组合。

    所以可以看到,问题在于YYYY-MM-DD格式是包含在标准中的,只是Safari没有实现。可以使用上文提到的DateJS对各种格式进行格式化以达到最大兼容性,举例如下:

    var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
    var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
    var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
    var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");

    不过,如果仅是很少量的使用日期时间,个人认为无需打动干戈的去使用DateJS这种库,简单的进行正则匹配为safari可以识别的格式即可,如下:

    new Date('2011-04-12'.replace(/-/g, "/"))

    更多其他的变化,可以根据自己的业务需求进行代码上的调整。

  • 相关阅读:
    Vue.js —— 关闭eslint校验
    彻底搞懂 module.exports/exports/import/export/export default
    JS 中的原型和原型链
    TypeScript-初级-08-声明合并
    TypeScript-初级-07-泛型
    TypeScript-初级-06-类与接口
    TypeScript-初级-05-类
    TypeScript-初级-04-枚举
    TypeScript-初级-03-元组
    TypeScript-初级-02-字符串字面量类型
  • 原文地址:https://www.cnblogs.com/zldream1106/p/3657217.html
Copyright © 2011-2022 走看看