日期:2014-05-16  浏览次数:20401 次

js 警惕你的 Date 对象

?

以下转载:

?

日子一天天过去,像时钟的表针一样摇曳着时光,很难想象没有时间的日子要怎样面对,又很讨厌生活在一分一秒的时间的格子里,人真是个矛盾的动物……
分 分秒秒,我们都跟时间有密切的接触。也因此,很多程序中,也少不了对时间的处理。
这本来已经很复杂,可是,这么多的浏览器厂商还是没能给我们一个 简单的环境。
还是那句话,生命不止,浏览器兼容性问题不歇。
今天,就说一下,跟时间有密切关系的

JS 内置对象 Date

Date 对象在JS里应该是比较常用的对象了,属于Native Object(相对于 Host Object,即,宿主对象,例如,document)。
关 于这个对象比较官方的说法在 ECMA-262 5th 的第 15.9 中,有兴趣的童鞋可以看看。
这个对象提供了好多比较实用的方法,但奈何 有些方法在各浏览器中的实现是不同的。千里之堤,溃于蚁穴,往往一个小小的失误,会造成致命的问题。为了程序的健壮性,我们应该去认识这些差异性,以做到 未雨绸缪,有效的规避这些错误。
那么,现在就说说常见的几个错误。

toLocaleString()的兼容性问题

根据 ECMA-262 5th中的说明,这个方法应该返回一个字符串的值,以合适的易读的方式,来显示当前时区的日期。具体没有规定显示成什么样子。
于是乎,差异就产 生了。
看例子:

JScript code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->document.write(( new Date( " 1999/09/09 " )).toLocaleString());


各浏览器中的结果:
Firefox 和 IE : 1999年9月9日 0:00:00
Opera: 1999/9/9 0:00:00
Safari: Thursday, September 09, 1999 00:00:00
Chrome : Thu Sep 09 1999 00:00:00 GMT+0800 (China Standard Time)

如果,你一直认 为,它的返回值是 “1999年9月9日 0:00:00”,并且按照它来处理,那么,你的程序逻辑,肯定会出问题。如果是比较基础的底层的方法,那么,可能会影响大功能。

关于日 期的显示,可以使用自己的方法,来消除这种差异。以下程序健壮性不好,是那么个意思。

JScript code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> /* * * date : Date 对象实例 */ function localeDate(date) { return date.getFullYear() + " " + (date.getMonth() + 1 ) + " " + date.getDate() + " " + " " + date.getHours() + " :