又一个IE的坑,时间字符串的转换

在JavaScript中,一般考虑使用Date.parse()函数来解析字符串。根据JavaScript的相关文档,可以得知Date.parse(dateVal)返回的是一个整数值,此整数表示 dateVal 中所提供的日期与 1970 年 1 月 1 日午夜之间相差的毫秒数。


不过Date.parse()并不能正确解析类似于2012-04-19的这种格式。而格式为4/19/2012的字符串则可以正常运行:

var time = Date.parse("4/19/2012");

此外,通过实际测试,我们发现IE、FF(火狐)、Chrome浏览器中Date.parse()函数支持的部分格式详情如下:

字符串格式(以2012年04月21日为例) IE FF Chrome
2012-4-21 X 只支持格式2012-04-21
4-21-2013 X
2012/4/21
4/21/2013

解决方法一:

我们可以将字符串的格式转为2012/4/214/21/2013等格式,再使用Date.parse()函数进行比较判断。

/**
 * 接收2012-04-09或2012-4-9格式的字符串,并返回该日期与1970年1月1日 00:00:00的毫秒差值
 * @param {String} dateStr
 * @return {Number} 
 */
function getTime(dateStr){
    dateStr = dateStr.replace("-", "/");
    return Date.parse(dateStr);
}

/**
 * 比较两个指定格式的日期字符串,并返回整数形式的比较结果。
 * 如果返回正数,则日期dateStr1较大(靠后);
 * 如果返回负数,则日期dateStr2较大;
 * 如果返回0,则两者相等。 
 * @param {String} date1
 * @param {String} date2
 * @return {Number} 
 */
function compareDate(dateStr1, dateStr2){
    return getTime(dateStr1) - getTime(dateStr2);
}

复制以上代码到需要使用的地方,在直接调用compareDate()函数即可。

由于JavaScript文档要求Date.parse()接收的参数最好符合月/日/年的格式。因此getTime()函数最好可以如下编写:

/**
 * 传入yyyy-M(MM)-d(dd)格式的字符串,返回相对于1970-1-1 00:00:00 000的毫秒数差值
 * @param {String} dateStr
 * @return {Number} 
 */
function getTime(dateStr){
    var dateStr = dateStr.replace(/^(\d{4})-(\d{1,2})-(\d{1,2})$/, "$2/$3/$1");
    return Date.parse(dateStr);
}


解决办法二:

在stackoverflow上,有这样一段代码:

Date.fromISO= (function(){
	var diso= Date.parse('2011-04-26T13:16:50Z');
	if(diso=== 1303823810000) return function(s){
		return new Date(Date.parse(s));
	} else return function(s){
		var day, tz, 
		rx= /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/, 
		p= rx.exec(s) || [];
		
		if(p[1]){
			day= p[1].split(/\D/).map(function(itm){
				return parseInt(itm, 10) || 0;
			});


			day[1]-= 1;
			/**
			这里使用了UTC进行时间转换,但是中国是用的G8失去,也就是说,比UTC时间早8个小时
			用UTC转换前要减去多出来的8个小时
			*/
			if( day.length>3 ){
				day[3] -= 8;
			}
			day= new Date(Date.UTC.apply(Date, day));
			if(!day.getDate()) return NaN;
			
			if(p[5]){
				tz= parseInt(p[5], 10)*60;
				if(p[6]) tz += parseInt(p[6], 10);
				if(p[4]== "+") tz*= -1;
				if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
			}


			return day;
		}
	return NaN;
	}
})()



这里要注意GMT和UTC的区别

stackoverflow上的代码是直接转换成了UTC,但是使用中国时区就得减8个小时了。在这里做个记录,给使用stackoverflow上的代码人做个提示




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值