我才12 ?

new Date()

昨天在调试bug的时候遇到一个问题,先看下代码:

<script>
var str = '2010-01-20';
alert(new Date(str.split('-').join(',')));
</script>

大家觉得这个会弹出来什么时间呢?2010年1月20日 or 2009年12月20日?。。。答案是丰富多彩的,看下在各浏览器下的情况:

new date

Firefox、Chrome 输出了2010年1月20日,Opera 输出了 2010年1月1日,Safari 提示非法时间,IE 输出了 NaN,这是为什么呢?

查阅权威指南ing….

new Date()可以有三种类型的参数,一是数字(milliseconds),表示毫秒,一是字符串(datestring),其格式是Date.parse()接受的格式,一是年月日….(year,month,day,hours,minutes,seconds,ms),我这里显然用的是第二种字符串了,ie 输出 NaN 表示ie其实并不支持这第二种参数形式,大家不妨自测一下,其它浏览器有正确输出的也有提示格式不对的等等,那么原因肯定在于各浏览器所能接受的格式有所不同,让我们进一步进行测试,测试结果如下。

其实我那么些的目的是为了使用第三种形式的参数:2010,1,20,结果。。。被我忽略的是其实我传进去的是一个字符串。。。也就是使用了第二种参数形式。。。杯具呀。。。

各浏览器支持的字符串的时间分隔符表:

分隔符IEOperaFirefoxChromeSafari
/
-××
,×××
#××××
*××××
$××××
!××××
@××××
%××××
.××××
?××××
××××
××××
^×××××
~×××××
(,),[,],{,}×××××
+×××××
:×××××
\×××××
|×××××

感叹一下,Chrome 好变态,基本上所有符号都支持了。。。或许有一天我们可以用它来区分各浏览器哈。。。另外结果页证明了我前边的推断ie不支持第二种形式的参数时错误的,ie支持 / 这个分隔符的,另外也支持 “Aug 9, 1995″ 之类的标准格式。

这个 bug 解决的方法其实很简单,就是采用第三种参数形式或者使用 ‘/’ 来分隔:

<script>
var arr = '2010-01-20'.split('-');
alert(new Date(arr[0],arr[1]-1,arr[2]));

//or var arr2 = '2010-01-20'.split('-'); alert(new Date(arr2.join('/')); </script>

看Firefox的 change log,应该是3.6开始支持 – 的,但是我这里测试没通过?记得在公司测试的时候是通过的呀。。。大家帮我测试一下吧。。。

另外,在看权威指南的时候,又看到一句:

Date()还可以作为普通函数被调用,而不带有运算符new。以这种方式调用时,Date()将忽略传递给它的所有参数,返回当前日期和事件的字符串标识。

^_^可以省几个字符了…

写了一个简单的脚本测试浏览器的支持情况,大家可以试下哈:http://www.12sui.cn/test/new-date-test.html

注:这里测试的仅是连接符类型的,其它的诸如”Aug 9, 1995″这种形式的没有做测试。测试浏览器为:IE6、IE7、IE8、Opera 10.10(Build 1893)、Firefox 3.6、Chrome 4.0.302.2、Safari 4.0.3(531.9.1)。

参考资料:

  • JavaScript权威指南第五版
  • Mozilla

标签:

这篇文章发布于 2010年01月29日,星期五,20:56,归类于 编码。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以留下评论,或者从您的站点trackback

4 条评论

雁过留声

这位姐姐,你好,你的浏览器版本太低了,为了避免您中毒,请您升级您的浏览器!