浅析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,每个域的介绍如下:

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/

       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, "/"))

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

作者:cnblogs 好多前端攻城师

时间: 2024-10-12 03:39:15

浅析Safari中的new Date()格式化坑的相关文章

JavaScript的new date等日期函数在safari中遇到的坑_javascript技巧

最近在做移动Web的时候,在PC上用Chrome调试都成功了,但是在iPhone上真机一测就出现了奇怪的问题.经过一系列调试发现是日期相关的地方出现了问题.起初怀疑是生产环境的问题,但用Mac版的safari调试本地也出现了同样的问题.查阅一些资料后发现,safari中对于JavaScript的new Date函数的支持有一个比较奇怪的问题. 通常,由于习惯了SQL中的datetime格式,日期是打成yyyy-mm-dd的格式,然而,safari竟然不支持这样的格式,所以当你输入如下语句时,会返

javascript 的Date 格式化, 模仿shell中date命令的格式

原文:javascript 的Date 格式化, 模仿shell中date命令的格式 shell 中显示当前的日期 [root@localhost]$ date '+%Y-%m-%d %H:%M:%S' 2015-01-19 16:24:58 把javascript 中的Date object 格式化成适合的字符串,很不方便,模拟shell中的格式 下面先用3段简单的代码来说明模拟函数中用到的特性 字符串的replace var a = '1234' undefined a.replace('1

浅析Java中Data类的应用

Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.

PHP日期函数date格式化UNIX时间的方法

 这篇文章主要介绍了PHP日期函数date格式化UNIX时间的方法,实例分析了php中date函数的使用技巧,需要的朋友可以参考下     本文实例讲述了PHP日期函数date格式化UNIX时间的方法.分享给大家供大家参考.具体分析如下: 日期函数可以根据指定的格式将一个unix时间格式化成想要的文本输出 使用到函数语法如下 ? 1 2 string date (string $Format); string date (string $Format, int $Time); 下面是演示代码 ?

java web-javaweb session中对象时间属性格式化问题

问题描述 javaweb session中对象时间属性格式化问题 项目实战中,遇到session中存了一个对象,对象中有个时间属性,在jsp页面中获取对象 时间属性时,显示出来的时间没有格式化,跪求各路大神帮忙解决下... 解决方案 那在jsp页面获取的时间属性是什么样子的呢?可以再格式化一下后显示. 解决方案二: public static String getDateString(Date date,String format){ SimpleDateFormat yfm = new Sim

浅析JavaScript 箭头函数 generator Date JSON_基础知识

ES6 标准新增了一种新的函数: Arrow Function(箭头函数). x => x *x 上面的箭头相当于: function (x){ return x*x; } 箭头函数相当于匿名函数,并且简化了函数定义.一种像上面的,只包含一个表达式, 连{ ... }和return都省略掉了.还有一种可以包含多条语句,这时候就不能省略{ ... }和return: x =>{ if(x > 0){ return x * x; }else{ return -x *x; } } 如果参数不是

浅析Java中Data类的应用_JSP编程

Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.

浅析java中stringBuilder的用法_java

String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类.例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能. 通过用一个重载的构造函数方法初始化变量,可以创建 Strin

深入理解MVC中的时间js格式化_javascript技巧

记录下我遇到的一个,MVC中post请求返回一个JSON字符串,其中包含数据库中的时间格式(如:/Date(10000000000)/),不知道怎么处理. 百度的方法都不适用,经自己研究,做成了一个Jquery插件,希望对大家有所帮助. 插件源代码: (function ($) { /格式化JSON返回的日期类型为自己定义的格式:如:yyyy-MM-dd hh:mm:ss dtstr:JSON返回的日期"/Date(10000000000)/" * fmt:自定义的格式,如:yyyy-