Date的那些事

之前在公司开发一个时间控件。老手告诉我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的对象了。大功告成。在不同浏览器上测试是通过的。

 

 

 

 

你可能感兴趣的:(Date)