// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
调用:
var time1 = new Date().Format("yyyy-MM-dd");
var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");
针对自己在日期格式化过程中遇到的一些问题,提出一些自己的理解,希望帮助更多初学者。
<script type="text/javascript">
//定义一个方法Format,参数为fmt=yyyy-MM-dd hh:mm:ss或者yyyy-MM-dd--是调用函数所传参数格式决定的
Date.prototype.Format = function(fmt){
//在方法里面首先定义了一个对象,有7对键值对即属性。,它的作用便于遍历取值
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
//其次在方法里面,进行了字符串匹配,并执行相应的行为
if(/(y+)/.test(fmt))///(y+)/作用匹配参数里面的yyyy,匹配成功,则执行下一步
{//replace查找并替换,RegExp.$1用于匹配捕获组即yyyy,this.getFullYear()获取年份,至于+"",可以这样理解如年份为2017,它是一个数字,如果变成字符串则可以使用+"",
//更具体一点,5+5=10,但是5+"5"=55,=》5+""="5".
//substr()截取字符串。substr(4 - RegExp.$1.length)可以理解为对年份截取的长度,如:2017,则fmt=2017-MM-dd hh:mm:ss,但如果输入的为:17
fmt= fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
//最后,遍历属性,取值
for(var k in o)
{//RegExp("(" + k + ")")意思:外层("")是RegExp构造函数的语法,模式必须是字符串。里层()是分组,以便单独处理,"(" + k + ")"可以看做字符串+变量+字符串,
if(new RegExp("(" + k + ")").test(fmt))
{ //replace查找并替换,此时这里的RegExp.$1=MM,dd,hh,mm,ss;接下来3元运算符判断键长度,如MM==8,长度为2!=1,所以执行("00"+ o[k]).substr((""+ o[k]).length))
//结果为:("00"+ 8).substr((""+ 8).length))=》("008").substr("8").length)=08,这里的""+o[k]的双引号用法同上面一样,substr("8").length=1,所以结果为08,如果要是MM==10,"0010",从第2为截取则为10.
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
//返回值
return fmt;
};
//调用方法
var time1 = new Date().Format("yyyy-MM-dd hh:mm:ss");
var time2 = new Date().Format("yyyy-MM-dd");
document.write(time1);
</script>