今天上午做项目,遇到一个小需求:已知一个回库日期(格式“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天后的日期