之前在公司开发一个时间控件。老手告诉我Date这个东西难搞啊,要考虑很多本身的逻辑合理性,又要考虑不同浏览器的兼容性。
当时就翻api猛查,发现了很多有意思的东西。
原来获取年数应该是getFullYear,不是getYear。
月份是从0开始的,呵呵,getMonth的时候需要 ++。
看完api原来很多方法可以在Date对象里封装了,不用自己写代码和复杂的逻辑判断了。如获取前一天可以这样
var d = new Date(); d.setDate(d.getDate() + 1)
这样就可以直接用封装好的Date对象,而不用考虑闰年,大小月的逻辑判断了。
虽然这里很方便,而api里的标准方法写的很详细。可是不同的浏览器实现起来还真是诡异,有些完全不按照标准去实现Date的。
先看下面这些代码
var dateStr1 = "2011-02-02"; var dateStr2 = "2011-2-2"; var dateStr3 = "2011/02/02"; console.log(new Date(dateStr1)); console.log(new Date(dateStr2)); console.log(new Date(dateStr3));
在 chrome上支持的很好,其输出结果为。三种日期格式串都可以
Wed Feb 02 2011 00:00:00 GMT+0800 (China Standard Time) date.html:17Wed Feb 02 2011 00:00:00 GMT+0800 (China Standard Time) date.html:18Wed Feb 02 2011 00:00:00 GMT+0800 (China Standard Time)
在ff日期格式要求就相对严格了很多。对数据的要求很高 必须 YYYY-MM-DD 4位-2位-2位才可以
Date {Wed Feb 02 2011 08:00:00 GMT+0800} Date {Invalid Date} Date {Wed Feb 02 2011 00:00:00 GMT+0800}
在ie8上就更是诡异。支持"2011/01/01"或者"2011/1/1" ,不支持"2011-01-01"
日志: NaN 日志: NaN 日志: Wed Feb 2 00:00:00 UTC+0800 2011
不过这些还不是令人费解的地方。ie8在调试断点状态和非调试断点状态又是不同。这可样郁闷。
现在也只是试了3个浏览器。其他浏览器还没有试过。又或者某个版本的状况又不同。要做这个的兼容可不是件容易的事。因为总有些你不知道的事冒出来。
于是我换了种实现方式。获取一个时间有3种方法。
dateObj = new Date() dateObj = new Date(dateVal) dateObj = new Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])
那么我们来用第三种方法。从第三种方法的参数来说,都是number,于是猜测这样的兼容性应该会好点,因为大家要调用的接口是一样的。
如果还是通过传一个日期的字符串过来,那么就得把字符串转成有效的参数调用第三个方法。
大致思路如下:
function StringToDate(DateStr) { var converted = Date.parse(DateStr); var myDate = new Date(converted); if (isNaN(myDate)) { var delimCahar = DateStr.indexOf('/')!=-1?'/':'-'; var arys = DateStr.split(delimCahar); myDate = new Date(arys[0], --arys[1], arys[2]); } return myDate; }
这样我们就创建了一个某个时间的Date的对象了。大功告成。在不同浏览器上测试是通过的。