Date对象的兼容性问题

最近用Datepicker出了一个很奇怪的兼容性问题,算是个坑,填一下

页面用的是jQuery-ui里面的datepicker组件,用来选择起止时间以展示数据,有一个需求是页面初始化的时候,默认加载最近7天的数据。
于是定义了一个获取N天前的xxxx-xx-xx的函数:

function addDate(date,days){
    var dtemp = date.replace(/[年-]/, "/").replace(/[月-]/, "/").replace("日", "");
    //在IE里面new Date().toLocaleDateString()会返回一个"xxxx年xx月xx日",这里做一个强制转换
    d.setDate(d.getDate()+days);
    var m=d.getMonth()+1;
    if (m.toString().length<2){m="0"+m;}
    var day = d.getDate();
    if (day.toString().length<2){day="0"+day;}
    return d.getFullYear()+'-'+m+'-'+day;
}

在chrome、IE8、ff等等都测了木有问题,于是灰常开心的上线了

结果,过了两天,boss说他的chrome初始化的时候,并没有自动加载七天的数据
f12一看也没有报错,真是x了狗了
google一下发现低版本的chrome(37)和IE(8以下),Date对象缺乏dateObj = new Date(dateString);这个方法= =
设了断点发现,执行到这里的时候不会报错,但是生成的Date对象是无效的,换句话说getYear这些个方法都返回了NaN
这不是逗我呢。。
但是支持以下三种方法:

dateObj = new Date()
dateObj = new Date(dateVal)
dateObj = new Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])

所以只要小小改动一下上面的函数就可以了:

function addDate(date,days){
    var dtemp = date.replace(/[年-]/, "/").replace(/[月-]/, "/").replace("日", "");
    //这里改成上面的第三种方法,传三个参数进去,就木有兼容性的问题了
    var darray = dtemp.split("/");
    var d = new Date(parseInt(darray[0]), parseInt(darray[1])-1, parseInt(darray[2]));
    d.setDate(d.getDate()+days);
    var m=d.getMonth()+1;
    if (m.toString().length<2){m="0"+m;}
    var day = d.getDate();
    if (day.toString().length<2){day="0"+day;}
    return d.getFullYear()+'-'+m+'-'+day;
}

解决

6.19 更新:
在IE11下测试的时候发现,虽然它支持传三个参数的方法,但是很奇怪的是,如果传入的三个参数是字符串中动态取得的,就会取到一个无效的Date对象,很wierd的一个错误。最后我们决定把所有的Date都改成用毫秒数来进行日期的加减,这样所有的浏览器都适配了。
PS:刚刚听说Web Assembly,好像很好玩的样子。搞前端的又一次发明了silverLight。。

Probably the END