一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JS 内置对象 Date

时间:2010-07-12 编辑:简简单单 来源:一聚教程网

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

tolocalestring()的兼容性问题

根据 ecma-262 5th中的说明,这个方法应该返回一个字符串的值,以合适的易读的方式,来显示当前时区的日期。具体没有规定显示成什么样子。
于是乎,差异就产生了。
看例子:
jscript codedocument.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
/**
* date : date 对象实例
*/

function localedate(date) {
        return date.getfullyear()+ "年"
                        + (date.getmonth()+ 1) + "月"
                        + date.getdate() + "日" + " "
                        + date.gethours() + ":"
                        + date.getminutes() + ":"
                        + date.getseconds();
}

需要注意的地方,有两点:
1. 获得年份的时候,使用的是 getfullyear(),而没有使用 getyear();
2. 月份使用 getmonth(),需加 1 才是真是月份值。

为什么没有使用getyear(),而使用的是getfullyear()呢?
因为getyear()同样存在兼容性问题。

getyear()兼容性问题

msdn 如此描述这个方法的:
对于1900-1999这段时间,调用 getyear() 方法将返回的年份值是一个两位数字的整数,它代表了所保存的年份与 1900 年之间的差距。而对于其它的年份,返回值是一个四位的整数。
参见msdn:http://msdn.microsoft.com/en-us/library/x0a9sc10%28vs.85%29.asp教程x
注意上面所说的"其他",是指1900年以前,2000及以后.

其它浏览器此部分的官方文档中则说明:
getyear() 返回的值始终为 date 对象中的年份与 1900 年之间的差值。
这个个方法已经过时,之所以提供这个方法,是为了保持向后的兼容性。请改用 getfullyear 方法。

 

 

通过测试,对比一下这两个方法:
html code


firefox 和 opera:
0000: getyear(): nan; getfullyear(): nan
0001: getyear(): nan; getfullyear(): nan
0099: getyear(): 99; getfullyear(): 1999
0100: getyear(): -1800; getfullyear(): 100
0500: getyear(): -1400; getfullyear(): 500
0999: getyear(): -901; getfullyear(): 999
1000: getyear(): -900; getfullyear(): 1000
1001: getyear(): -899; getfullyear(): 1001
1500: getyear(): -400; getfullyear(): 1500
1899: getyear(): -1; getfullyear(): 1899
1900: getyear(): 0; getfullyear(): 1900
1901: getyear(): 1; getfullyear(): 1901
1999: getyear(): 99; getfullyear(): 1999
2000: getyear(): 100; getfullyear(): 2000
2001: getyear(): 101; getfullyear(): 2001
2009: getyear(): 109; getfullyear(): 2009

ie:
0000: getyear(): nan; getfullyear(): nan
0001: getyear(): nan; getfullyear(): nan
0099: getyear(): 99; getfullyear(): 1999
0100: getyear(): 100; getfullyear(): 100
0500: getyear(): 500; getfullyear(): 500
0999: getyear(): 999; getfullyear(): 999
1000: getyear(): 1000; getfullyear(): 1000
1001: getyear(): 1001; getfullyear(): 1001
1500: getyear(): 1500; getfullyear(): 1500
1899: getyear(): 1899; getfullyear(): 1899
1900: getyear(): 0; getfullyear(): 1900
1901: getyear(): 1; getfullyear(): 1901
1999: getyear(): 99; getfullyear(): 1999
2000: getyear(): 2000; getfullyear(): 2000
2001: getyear(): 2001; getfullyear(): 2001
2009: getyear(): 2009; getfullyear(): 2009

chrome:
0000: getyear(): 100; getfullyear(): 2000
0001: getyear(): 101; getfullyear(): 2001
0099: getyear(): 99; getfullyear(): 1999
0100: getyear(): -1800; getfullyear(): 100
0500: getyear(): -1400; getfullyear(): 500
0999: getyear(): -901; getfullyear(): 999
1000: getyear(): -900; getfullyear(): 1000
1001: getyear(): -899; getfullyear(): 1001
1500: getyear(): -400; getfullyear(): 1500
1899: getyear(): -1; getfullyear(): 1899
1900: getyear(): 0; getfullyear(): 1900
1901: getyear(): 1; getfullyear(): 1901
1999: getyear(): 99; getfullyear(): 1999
2000: getyear(): 100; getfullyear(): 2000
2001: getyear(): 101; getfullyear(): 2001
2009: getyear(): 109; getfullyear(): 2009

safari:
0000: getyear(): 100; getfullyear(): 2000
0001: getyear(): 101; getfullyear(): 2001
0099: getyear(): 99; getfullyear(): 1999
0100: getyear(): -1801; getfullyear(): 99
0500: getyear(): -1401; getfullyear(): 499
0999: getyear(): -902; getfullyear(): 998
1000: getyear(): -901; getfullyear(): 999
1001: getyear(): -899; getfullyear(): 1001
1500: getyear(): -400; getfullyear(): 1500
1899: getyear(): -1; getfullyear(): 1899
1900: getyear(): 0; getfullyear(): 1900
1901: getyear(): 1; getfullyear(): 1901
1999: getyear(): 99; getfullyear(): 1999
2000: getyear(): 100; getfullyear(): 2000
2001: getyear(): 101; getfullyear(): 2001
2009: getyear(): 109; getfullyear(): 2009

可见,在获取 1000 年后的日期的年份儿时,getfullyear() 方法还是比较保险的,但是,1000年以及以前的就不保险了。safari对 100~1000年之间的年份儿,直接少了1年。其他浏览器倒还可以。小于100年的就比较扯了,都很扯。

热门栏目