视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
javascript日期处理函数,性能优化批处理_基础知识
2020-11-27 21:43:19 责编:小采
文档
 其实网上写javascript日期格式化的博文很多,大体都看了看,都还不错。唯一遗憾的是只顾着实现了功能,没对函数进行性能优化。
俗话说:不要重复造轮子。google上找了一个比较不错的日期格式化函数,来开始我的优化之旅吧!
google上找的这个日期函数化函数,估计大家都很眼熟,以前我也一直在用。先看看优化后和优化前的效率对比吧!
1、优化之前的toDate函数(字符串转换成Date对象),重复执行1万次,耗时660毫秒

2、优化之前的dateFormat函数(Date对象格式化成字符串),重复执行1万次,耗时676毫秒

3、优化过后的toDate函数,重复执行1万次,耗时122毫秒

4、优化后的dateFormat函数,重复执行1万次,耗时160毫秒

为什么前后差别这么大,其实我也没做多少处理,只是为批处理做了一些缓存而已,认真观察所有网上那些日期格式函数,其实都是用正则进行匹配和替换。其实正则是很耗性能的,于是我在正则匹配的地方做了缓存,把匹配值建立索引。以后就不用每次都去做正则匹配了。

无代码无,接下来看看吧!

(function(window) {
 var sinojh = {
 Version : "1.2",
 Copyright : "Copyright© sino-jh 2012",
 Author : "Jeff Lan",
 Email : "jefflan@live.cn"
 };
 /**
 * 方便于添加和重写类的属性
 * @param {Object} attributes 添加的属性
 */
 Function.prototype.prototypes = function(attributes) {
 for ( var a in attributes) {
 this.prototype[a] = attributes[a];
 }
 };
 /**
 * 获取Url参数
 * @param {String} parameter 参数名
 * @return {String} 参数值
 */
 sinojh.getUrlParameter = function(parameter) {
 if (!sinojh.getUrlParameter.cache) {
 var url = window.location.href;
 var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&");
 var cache = {};
 for ( var i in paraString) {
 var j = paraString[i];
 cache[j.substring(0, j.indexOf("="))] = j.substring(j.indexOf("=") + 1, j.length);
 }
 sinojh.getUrlParameter.cache = cache;
 }
 return sinojh.getUrlParameter.cache[parameter];
 };
 /**
 * 日期格式化
 * @param {Date} date 日期对象
 * @param {String} formatStyle 格式化样式
 * @return {String} 日期型字符串
 */
 sinojh.dateFormat = function(date, formatStyle) {
 formatStyle = formatStyle ? formatStyle : sinojh.dateFormat.settings.formatStyle;
 var time = {
 "M+" : date.getMonth() + 1,
 "d+" : date.getDate(),
 "h+" : date.getHours(),
 "m+" : date.getMinutes(),
 "s+" : date.getSeconds(),
 "S" : date.getMilliseconds()
 };
 if (formatStyle == sinojh.dateFormat.formatStyleCache) {
 var replaceCache = sinojh.dateFormat.replaceCache;
 if (replaceCache["y+"]) {
 formatStyle = formatStyle.replace(replaceCache["y+"].replace, (date.getFullYear() + "").substring(replaceCache["y+"].index));
 }
 for ( var k in time) {
 if (replaceCache[k]) {
 formatStyle = formatStyle.replace(replaceCache[k].replace, replaceCache[k].replace.length == 1 ? time[k] : ("00" + time[k]).substring(("" + time[k]).length));
 }
 }
 } else {
 sinojh.dateFormat.formatStyleCache = formatStyle;
 var replaceCache = {};
 if (new RegExp("(y+)").test(formatStyle)) {
 var index = 4 - RegExp.$1.length;
 replaceCache["y+"] = {
 replace : RegExp.$1,
 index : index
 };
 formatStyle = formatStyle.replace(RegExp.$1, (date.getFullYear() + "").substring(index));
 }
 for ( var k in time) {
 if (new RegExp("(" + k + ")").test(formatStyle)) {
 replaceCache[k] = {
 replace : RegExp.$1
 };
 formatStyle = formatStyle.replace(RegExp.$1, RegExp.$1.length == 1 ? time[k] : ("00" + time[k]).substring(("" + time[k]).length));
 }
 }
 sinojh.dateFormat.replaceCache = replaceCache;
 }
 return formatStyle;
 };
 sinojh.dateFormat.settings = {
 formatStyle : "yyyy-MM-dd hh:mm:ss"
 };
 /**
 * 将日期格式的字符串转换成Date对象
 * @param {String} dateStr 日期格式字符串
 * @param {String} dateStyle 日期格式
 * @return {Date} 日期对象
 */
 sinojh.toDate = function(dateStr, dateStyle) {
 dateStyle = dateStyle ? dateStyle : sinojh.toDate.settings.dateStyle;
 var compare = sinojh.toDate.compare;
 var result = new sinojh.toDate.result();
 if (dateStyle == sinojh.toDate.settings.dateStyleCache) {
 var indexCache = sinojh.toDate.indexCache;
 for ( var k in compare) {
 if (indexCache[k]) {
 result[compare[k]] = dateStr.substring(indexCache[k].index, indexCache[k].index + indexCache[k].length);
 }
 }
 } else {
 var indexCache = {};
 for ( var k in compare) {
 if (new RegExp("(" + k + ")").test(dateStyle)) {
 var index = dateStyle.indexOf(RegExp.$1);
 var length = RegExp.$1.length;
 indexCache[k] = {
 index : index,
 length : length
 };
 result[compare[k]] = dateStr.substring(index, index + length);
 }
 }
 sinojh.toDate.indexCache = indexCache;
 sinojh.toDate.settings.dateStyleCache = dateStyle;
 }
 return new Date(result["y"], result["M"] - 1, result["d"], result["h"], result["m"], result["s"], result["S"]);
 };
 sinojh.toDate.compare = {
 "y+" : "y",
 "M+" : "M",
 "d+" : "d",
 "h+" : "h",
 "m+" : "m",
 "s+" : "s",
 "S" : "S"
 };
 sinojh.toDate.result = function() {
 };
 sinojh.toDate.result.prototypes( {
 "y" : "",
 "M" : "",
 "d" : "",
 "h" : "00",
 "m" : "00",
 "s" : "00",
 "S" : "000"
 });
 sinojh.toDate.settings = {
 dateStyle : "yyyy-MM-dd hh:mm:ss"
 };
 delete Function.prototype.prototypes;
 window.jh = sinojh;
}(this); 

下载本文
显示全文
专题