感谢 meizz 大神写的时间格式化通用函数,作为学习,简单解析一下
Date.prototype.format = function(format)
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
// 这块代码的主要作用:根据 y 格式化当前年 yyyy = 2019 yy = 19
if(/(y+)/.test(format)){ // 如果包含y的话,也就是有年 RegExp.$1 => 代表匹配的第一组内容
format=format.replace(RegExp.$1,(this.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;
}
alert(new Date().format("yyyy-MM-dd hh:mm:ss"));
【分析】
当前的日期格式化的核心思想就是正则替换
第3行到第11行代码主要用来存储每一个格式化字符对应的当前日期的具体信息
关于正则的加号(+)解释:
量词符,表示匹配目标一次或多次,表明目标在对应字符串中所出现的次数不得少于一次。
第13行到第15行代码主要是将格式化字符串中出现的y替换为对应的年,最长4个字符(yyyy),最少1个(y)
关于 RegExp.$1 的解释:匹配成功的第一组内容,对于非法的格式化字符串(yyyy-y)可以进行有效过滤,返回的结果将是格式化错误
对于截取的逻辑:
本人觉得可以改成 substr((-RegExp.$1.length)),其实对应的含义是一样的
第16行到第20行代码主要是将格式化字符串中剩余的字符替换为对应的日期信息
主要逻辑:
format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
如果匹配成功的第一组内容的长度为1,则直接返回对应的日期信息;
否则,通过再次格式化(MM => "05" dd=>"17")起了一个对单位数日期进行追加零的效果
【参考文章】