今天上午做项目,遇到一个小需求:已知一个回库日期(格式“yyyy-MM-dd”),周期为N(单位:月),需要求有效日期(等于回库日期加周期)。简单来说,就是一个日期的月份加上几个月得最后的日期。
从网上找了一些JavaScript中的Date的介绍,找到了一个如下的解决办法:
function setKEEPENDDATE(str,p){
//var str 回库日期的字符串形式,如2009-12-31
//var p 周期
var s;
//在构造日期的时候,月份上加p
var date = new Date(str.substring(0,4),str.substring(5,7)-1+p, str.substring(8,10)); //取年份
s += date.getMonth()+1 + “-”; //取月份
s += date.getDate(); //取日期
return s;
}
这样做的话,会实现月份增加p个月,而且当结果大于12的时候,会自动是年份加1,但是这样做有个问题:这样只是简单的实现月份相加,而没有考虑到一个月有多少天,换个思维说,如果把增加p个月份,改为增加相等于p个月的天数相加的话,到底增加多少天,是不能确定的,因为你不知道这时候的一个月应该是按28?29?30?31?天算的。
举个例子:
回库日期:2009-12-31
周期:2月
有效日期:2009-03-03
仔细思考上面的结果就知道,这里的2个月是按62天算的,所以才得出上面的值,但是实际中你期望的2月份后的日期会是2009-03-03吗?显然不是!
那么上面的问题该怎样解决呢?
先来看看上面的问题,如果是用java代码处理,结果会是如何。关于java中的日期时间类的处理参看我的另一篇文章:【
java中关于时间日期操作的常用函数
】
SimpleDateFormat sdf = new SimpleDateFormat(
“yyyy-MM-dd”);
Calendar calendar = new GregorianCalendar();
Date date = sdf.parse(LiscenseDate); // LiscenseDate回库日期的字符串形式
calendar.setTime(date);
calendar.add(Calendar.MONTH, Period); // Period为周期,回库日期+周期=有效期
KeepEndDate = sdf.format(calendar.getTime());//KeepEndDate为有效期的字符串形式
还是上面的例子,用上门的java代码处理,得出的结果是:20010-02-28,这样的结果才更符合实际,也证明了上面用javascript实现的月份相加是不合实际的,那么用javascript到底如何解决上面的问题呢?方法如下:
function setKEEPENDDATE(str,p){
var s;
var days=0;
var date = new Date(str.substring(0,4),
str.substring(5,7)-1,
str.substring(8,10));
for(var i=0;i<p;i++){
days=GetMonthDayCount(date);
date.setDate(date.getDate()+days);
s = date.getYear() + “-”; //取年份
s += date.getMonth()+1 + “-”; //取月份
s += date.getDate(); //取日期
return s;
// 返回某个日期对应的月份的天数
function GetMonthDayCount(date)
var m=date.getMonth()+1;
if(m==12){
}else{
m+=1;
switch(m)
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
case 4:case 6:case 9:case 11:
return 30;
//feb:
date=new Date(date);
var lastd=28;
date.setDate(29);
while(date.getMonth()==1)
lastd++;
AddDays(date,1);
return lastd;
} 增加天
function AddDays(date,value)
date.setDate(date.getDate()+value);
}
解决的思路是,把增加月份转化为增加天数,所以必须判断某一个月有多少天,应该增加多少天!
其实,在Extjs中时间的相加非常简单。ExtJs提供了个add()的日期方法,其第一个参数用来指定时间单位,可以为月、天、小时等。如:
new Date(’10/1/2010′).add(Date.DAY,+3)用来计算某一个时间加3天后的日期