最近开发的软件中需要用到日志功能其中有一个重要功能是显示日期和时间于是网上搜了一把搜到大量的日期格式化函数不过比较了下感觉代码都不够优雅而且性能都不给力
对线上一些代码进行了评测结果如下
测试代码如下分别对格式化函数进行万次计算
代码如下
var start = new Date()getTime();
var date = new Date();
for(var i = ;i<;i++){
dateformat(yyyyMMdd hh:mm:ss);
}
consolelog(new Date()getTime() start);
函数
代码如下
// 对Date的扩展将 Date 转化为指定格式的String
// 月(M)日(d)小时(h)分(m)秒(s)季度(q) 可以用 个占位符
// 年(y)可以用 个占位符毫秒(S)只能用 个占位符(是 位的数字)
// 例子
// (new Date())Format("yyyyMMdd hh:mm:ssS") ==> ::
// (new Date())Format("yyyyMd h:m:sS") ==> ::
Dateprototypeformat = function (fmt) { //author: meizz
var o = {
"M+": thisgetMonth() + //月份
"d+": thisgetDate() //日
"h+": thisgetHours() //小时
"m+": thisgetMinutes() //分
"s+": thisgetSeconds() //秒
"q+": Mathfloor((thisgetMonth() + ) / ) //季度
"S": thisgetMilliseconds() //毫秒
};
if (/(y+)/test(fmt)) fmt = fmtreplace(RegExp$ (thisgetFullYear() + "")substr( RegExp$length));
for (var k in o)
if (new RegExp("(" + k + ")")test(fmt)) fmt = fmtreplace(RegExp$ (RegExp$length == ) ? (o[k]) : (("" + o[k])substr(("" + o[k])length)));
return fmt;
}
测试三次
成绩毫秒
成绩毫秒
成绩毫秒
平均毫秒
函数
代码如下
/** * 对Date的扩展将 Date 转化为指定格式的String * 月(M)日(d)小时(h)小时(H)分(m)秒(s)周(E)季度(q)
可以用 个占位符 * 年(y)可以用 个占位符毫秒(S)只能用 个占位符(是 位的数字) * eg: * (new
Date())pattern("yyyyMMdd hh:mm:ssS")==> ::
* (new Date())pattern("yyyyMMdd E HH:mm:ss") ==> 二 ::
* (new Date())pattern("yyyyMMdd EE hh:mm:ss") ==> 周二 ::
* (new Date())pattern("yyyyMMdd EEE hh:mm:ss") ==> 星期二 ::
* (new Date())pattern("yyyyMd h:m:sS") ==> ::
*/
Dateprototypeformat=function(fmt) {
var o = {
"M+" : thisgetMonth()+ //月份
"d+" : thisgetDate() //日
"h+" : thisgetHours()% == ? : thisgetHours()% //小时
"H+" : thisgetHours() //小时
"m+" : thisgetMinutes() //分
"s+" : thisgetSeconds() //秒
"q+" : Mathfloor((thisgetMonth()+)/) //季度
"S" : thisgetMilliseconds() //毫秒
};
var week = {
"" : "/ue"
"" : "/ue"
"" : "/uec"
"" : "/ue"
"" : "/udb"
"" : "/ue"
"" : "/ud"
};
if(/(y+)/test(fmt)){
fmt=fmtreplace(RegExp$ (thisgetFullYear()+"")substr( RegExp$length));
}
if(/(E+)/test(fmt)){
fmt=fmtreplace(RegExp$ ((RegExp$length>) ? (RegExp$length> ? "/uf/uf" : "/u") : "")+week[thisgetDay()+""]);
}
for(var k in o){
if(new RegExp("("+ k +")")test(fmt)){
fmt = fmtreplace(RegExp$ (RegExp$length==) ? (o[k]) : ((""+ o[k])substr((""+ o[k])length)));
}
}
return fmt;
}
测试三次
成绩毫秒
成绩毫秒
成绩毫秒
平均毫秒
本着完美主义的态度自己重新造了个更好的轮子分享给需要的同学们代码如下
代码如下
/**
* 对日期进行格式化
* @param date 要格式化的日期
* @param format 进行格式化的模式字符串
* 支持的模式字母有
* y:年
* M:年中的月份()
* d:月份中的天()
* h:小时()
* m:分()
* s:秒()
* S:毫秒()
* q:季度()
* @return String
* @author yaniswang@gmailcom
*/
function dateFormat(date format) {
if(format === undefined){
format = date;
date = new Date();
}
var map = {
"M": dategetMonth() + //月份
"d": dategetDate() //日
"h": dategetHours() //小时
"m": dategetMinutes() //分
"s": dategetSeconds() //秒
"q": Mathfloor((dategetMonth() + ) / ) //季度
"S": dategetMilliseconds() //毫秒
};
format = formatreplace(/([yMdhmsqS])+/g function(all t){
var v = map[t];
if(v !== undefined){
if(alllength > ){
v = + v;
v = vsubstr(vlength);
}
return v;
}
else if(t === y){
return (dategetFullYear() + )substr( alllength);
}
return all;
});
return format;
}
使用方法
dateFormat(yyyyMMdd hh:mm:ss);
dateFormat(new Date() yyyyMMdd hh:mm:ss);
测试三次
成绩毫秒
成绩毫秒
成绩毫秒
平均毫秒
经过改造的函数整体上性能提升明显从毫秒提升到毫秒减少了毫秒整体降到原%的时间性能提升一倍以上并且从原形注入方式改为静态函数方式更优雅大方