• 一个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日为例)IEFFChrome
    2012-4-21 X 只支持格式2012-04-21
    4-21-2013 X
    2012/4/21
    4/21/2013

    解决方法一:

    我们可以将字符串的格式转为2012/4/21或4/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);
    }

      由于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);
    }

    资源搜索网站大全https://55wd.com 广州品牌设计公司http://www.maiqicn.com

    解决办法二:

    在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}-dd-dd([tT][d:.]*)?)([zZ]|([+-])(dd):(dd))?$/, 
        		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上的代码人做个提示

  • 相关阅读:
    [Swift]LeetCode806. 写字符串需要的行数 | Number of Lines To Write String
    [Swift]LeetCode805. 数组的均值分割 | Split Array With Same Average
    [Swift]LeetCode804. 唯一摩尔斯密码词 | Unique Morse Code Words
    [Swift]LeetCode803. 打砖块 | Bricks Falling When Hit
    [Swift]LeetCode802. 找到最终的安全状态 | Find Eventual Safe States
    [Swift]LeetCode801. 使序列递增的最小交换次数 | Minimum Swaps To Make Sequences Increasing
    [Swift]LeetCode799. 香槟塔 | Champagne Tower
    [Swift]LeetCode798. 得分最高的最小轮调 | Smallest Rotation with Highest Score
    [Swift]LeetCode797. 所有可能的路径 | All Paths From Source to Target
    转:12C PDB 配置不同的PDB监听端口
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13754925.html
Copyright © 2020-2023  润新知