最近一个小项目上涉及日期字符串格式化的问题,由于之前大部分工作中使用现有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及以下版本。
上一篇: 迟到的羊年祝福 下一篇: Intellij Idea下打包JavaWeb项目忽略外部依赖包(Tomcat为例)