IE8及以下瀏覽器js中日期字符串格式化問題解決打賞

最近一個小項目上涉及日期字符串格式化的問題,由于之前大部分工作中使用現有js框架自帶的組件庫,并沒有注意此類兼容性問題,直到最近才發現,原來在IE8及以下IE版本中,JavaScript的Date函數是不支持new Date("2013-12-31")、new Date("2013-12-31 00:00:00")或者new Date("2013-12-31T00:00:00Z")這樣的構造方式的。

網上關于字符串格式化的函數一般都雷同,如下

function dateFormat(dateString,format) {
            if(!dateString)return "";
            var time = new Date(dateString);
            var o = {
                "M+": time.getMonth() + 1, //月份
                "d+": time.getDate(), //日
                "h+": time.getHours(), //小時
                "m+": time.getMinutes(), //分
                "s+": time.getSeconds(), //秒
                "q+": Math.floor((time.getMonth() + 3) / 3), //季度
                "S": time.getMilliseconds() //毫秒
            };
            if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return format;
        }

對于IE8以下的兼容性問題,網上則大部分采用正則匹配來一一設置年月日等,但基本都是只匹配了年月日,如下

function parseISO8601(dateStringInRange) {
   var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,
       date = new Date(NaN), month,
       parts = isoExp.exec(dateStringInRange);

   if(parts) {
     month = +parts[2];
     date.setFullYear(parts[1], month - 1, parts[3]);
     if(month != date.getMonth() + 1) {
       date.setTime(NaN);
     }
   }
   return date;
 }

雖然我們可以更改正則來匹配帶有時分秒的字符格式日期,但終歸不是完美解決方法,經過翻閱網絡資料發現,原來JavaScript中Date的構造參數是諸如2013/12/31或2013/12/31 00:00:00之類的字符串,因此,上面dateFormat函數我們可以簡單修改后實現IE8及以下版本瀏覽器的兼容,修改如下

function dateFormat(dateString,format) {
            if(!dateString)return "";
            var time = new Date(dateString.replace(/-/g,'/').replace(/T|Z/g,' ').trim());
            var o = {
                "M+": time.getMonth() + 1, //月份
                "d+": time.getDate(), //日
                "h+": time.getHours(), //小時
                "m+": time.getMinutes(), //分
                "s+": time.getSeconds(), //秒
                "q+": Math.floor((time.getMonth() + 3) / 3), //季度
                "S": time.getMilliseconds() //毫秒
            };
            if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return format;
        }

很簡單,這里只是簡單替換“-”為“/”,“T和Z”為空格,經測試這樣既可兼容IE8及以下版本。

IE8及以下瀏覽器js中日期字符串格式化問題解決
文章《IE8及以下瀏覽器js中日期字符串格式化問題解決》二維碼
  • 微信打賞
  • 支付寶打賞

已有2條評論

  1. 湯寒劍

    謝謝博主分享

    2016-03-08 17:39 回復
  2. 孤帆懸劍

    謝謝博主分享

    2016-01-07 17:09 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖