js日期相加

今天上午做项目,遇到一个小需求:已知一个回库日期(格式“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.getYear() + “-”;            //取年份
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){
m=1;
}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天后的日期

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值