最近開發的軟件中需要用到日志功能,其中有一個重要功能是顯示日期和時間。於是網上搜了一把,搜到大量的日期格式化函數,不過比較了下,感覺代碼都不夠優雅,而且性能都不給力。
對線上一些代碼進行了評測,結果如下:
測試代碼如下,分別對格式化函數進行50萬次計算:
代碼如下var start = new Date().getTime();
var date = new Date();
for(var i = 0;i<500000;i++){
date.format1('yyyy-MM-dd hh:mm:ss');
}
console.log(new Date().getTime() - start);
函數1:
代碼如下// 對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.format1 = 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;
}
測試三次:
成績1:6657毫秒
成績2:6739毫秒
成績3:6747毫秒
平均:6714毫秒
函數2:
代碼如下/** * 對Date的擴展,將 Date 轉化為指定格式的String * 月(M)、日(d)、12小時(h)、24小時(H)、分(m)、秒(s)、周(E)、季度(q)
可以用 1-2 個占位符 * 年(y)可以用 1-4 個占位符,毫秒(S)只能用 1 個占位符(是 1-3 位的數字) * eg: * (new