不要图省事就复制粘贴

luoyjx · 2015-07-09 15:41 · 1099次阅读

例子

先看代码再说:

抽象前

function setSignAndHandleTime() {
    //一天后的时间
	var date1=new Date();
	date1.setDate(date1.getDate()+1);
	var dateM1 = date1.getMonth()+1;
	var dateD1 = date1.getDate();
	var hour1 = date1.getHours(); //获取当前小时数(0-23)
	var minute1 = date1.getMinutes(); //获取当前分钟数(0-59)
	var second1 = date1.getSeconds(); //获取当前秒数(0-59)
	//七天后的时间
	var date2=new Date();
	date2.setDate(date2.getDate()+7);
	var dateM2 = date2.getMonth()+1;
	var dateD2 = date2.getDate();
	var hour2 = date2.getHours(); //获取当前小时数(0-23)
	var minute2 = date2.getMinutes(); //获取当前分钟数(0-59)
	var second2 = date2.getSeconds(); //获取当前秒数(0-59)
	var selDateStr1 = date1.getFullYear() + "-" + dateM1+ "-" +  dateD1 + " " +hour1+ ":" + minute1 +":" +second1;
	var selDateStr2 = date2.getFullYear() + "-" + dateM2+ "-" +  dateD2 + " " +hour2+ ":" + minute2 +":" +second2;
}

想法

代码挺长的,恩,估计有一点复杂。仔细看一遍,我擦咧!竟然只是将日期调整并格式化了一下。 基本可以分成2部分:

  1. 将日期调整到一天后的时间,并格式化
  2. 将日期调整到七天后的时间,并格式化

这还只是一个函数,后面还有数个差不多的函数实现了差不多的功能。 复制粘贴虽然方便,但是,这样堆积起来的代码以后维护起来看着不累吗? 其实,这其中也没干啥事啊,也就是改变日期,和格式化。

抽象一下吧,这时我就想起来之前的扩展原型的方式来格式化javascript的Date对象了(因为他自身是没有格式化函数的)。这里是原文 javascript、nodejs使用原型方式格式化日期

还有调整日期的方法,因为看上去只是传递了一个天数进行加法,所以可以认为传个整数就是多少天之后,负数则是多少天之前。

好的,到这里扩展的类基本上差不多了。

/**
 * Date对象格式化
 * 此方法对Date对象的原型进行扩展
 * 因此定义后,再创建的Date实例都带有format方法
 * @param {String} fmt 格式字符串
 */
Date.prototype.format = function (fmt) { 
	//没有传格式给默认格式
	fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
	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;
};

/**
 * 调整当前date的天时间
 * @param {Number} distance 正数为加上天数,负数为减去天数
 * @returns {Date} date 返回当前对象,以便链式调用
 */
Date.prototype.adjustDay = function(distance) {
	if (isNaN(distance)) {
		throw TypeError('distance参数必须是一个数字');
	} else if (typeof distance === 'string') {
		distance = parseInt(distance, 10);
	}
	this.setDate(this.getDate() + distance);
	return this;
};

抽象后

以上是工具类的方法,再来看看抽象后的代码

function setSignAndHandleTime(signDays, handleDays) {
	//一天后的时间
	var date1=new Date();
	date1.adjustDay(signDays);//正数在当前天加上天数 
	var selDateStr1 = date1.format();
	//七天后的时间
	var date2 = new Date();
	date2.adjustDay(handleDays);
	var selDateStr2 = date2.format();
	$('#provisionSignTime').datetimebox('setValue', selDateStr1);
	$('#provisionHandleTime').datetimebox('setValue', selDateStr2);
}

是不是在炎热的夏天瞬间感觉凉爽了许多~

最后

能不复制粘贴就不要这么干了啊啊啊啊啊啊

收藏

暂无评论

登录后可以进行评论。没有账号?马上注册