IE下JavaScript Date对象的不同之处

之前在仓库作业机器监控系统项目中使用HighCharts的时间序列数据图来绘制机器CPU使用率、内存使用量、网络流量趋势变化图等,这些图在IE下却没有正常显示,IE也没有报错,按理说HighCharts的IE兼容性是较好的,不会出现这种问题, 最后查明原因---确实不是HighCharts的问题,而是由于IE下JavaScript的Date对象缺少一种构造函数导致的。

IE中JavaScript的Date对象有如下三种构造函数

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

其他浏览器中除了这三种之外,还有一种:

dateObj = new Date(dateString);

如果在IE下使用了这种构造函数,IE不会提示错误,但在调用dateObj的getMonth、getDate等等方法时返回的是NaN,从而导致了其他问题。


更新

注:感谢@yiyun指出,IE中的Date构造函数只是不支持"xxxx-xx-xx"这种格式的时间字符串文档也有说明,是我阅读不仔细:

dateVal
    必需。如果是数值,dateVal表示指定日期与1970年1月1日午夜之间相差的协调世界时的毫秒数。   
    如果是字符串,则根据日期和时间字符串(JavaScript)中的规则分析dateVal。dateVal参数也可以是从一些ActiveX对象返回的 VT_DATE值。

其中日期和时间字符串的规则见:http://msdn.microsoft.com/zh-cn/library/ie/ff743760.aspx


在我的案例中,是需要将时间字符串“xxxx-xx-xx”(如“2013-12-03”)转换成一个Date对象,为了兼容IE,我如下实现:

function newIEDate(dateStr) {
    // dateStr的格式:xxxx-xx-xx
    var dateParts = dateStr.split("-");
    return new Date(parseInt(dateParts[0]), parseInt(dateParts[1])-1, parseInt(dateParts[2]));
}
...
var objDate;
if ($.browser.msie) {
    objDate = newIEDate(queryDate);
} else {
    objDate = new Date(queryDate);
}

代码中,$.browser.msie来自jQuery。另外,构造函数new Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])中的year必须是年份全称(如1998,而不应是98),month参数则应在0-11(代表1月至12月)之间取值。

参考资料

Comments