javascript

位置:IT落伍者 >> javascript >> 浏览文章

Javascript日期格式化函数性能对比


发布日期:2019年04月11日
 
Javascript日期格式化函数性能对比

最近开发的软件中需要用到日志功能其中有一个重要功能是显示日期和时间于是网上搜了一把搜到大量的日期格式化函数不过比较了下感觉代码都不够优雅而且性能都不给力

对线上一些代码进行了评测结果如下

测试代码如下分别对格式化函数进行万次计算

                        代码如下                                                   

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);

            

            

测试三次

            

成绩毫秒

            

成绩毫秒

            

成绩毫秒

            

平均毫秒

                        

经过改造的函数整体上性能提升明显毫秒提升到毫秒减少了毫秒整体降到原%的时间性能提升一倍以上并且从原形注入方式改为静态函数方式更优雅大方

               

上一篇:javascript中比较字符串是否相等的方法

下一篇:浅谈JavaScript之事件绑定