计算两个日期之间相差的月数和天数

本文介绍了一个Java日期操作工具类,包含获取两个日期间的月份数、天数及特定日期剩余天数的方法。通过实例展示了如何处理日期边界情况,如是否跨越月份等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class DateUtils {
public int getMonth(Date s,Date e){
if(s.after(e)){
Date t=s;
s=e;
e=t;
}
Calendar start = Calendar.getInstance();
start.setTime(s);
Calendar end = Calendar.getInstance();
end.setTime(e);
Calendar temp=Calendar.getInstance();
temp.setTime(e);
temp.add(Calendar.DATE,1);

int y=end.get(Calendar.YEAR)-start.get(Calendar.YEAR);
int m=end.get(Calendar.MONTH)-start.get(Calendar.MONTH);

if((start.get(Calendar.DATE)==1) && (temp.get(Calendar.DATE)==1)){//前后都不破月
return y*12+m+1;
}
else if((start.get(Calendar.DATE)!=1) && (temp.get(Calendar.DATE)==1)){//前破月后不破月
return y*12+m;
}
else if((start.get(Calendar.DATE)==1) && (temp.get(Calendar.DATE)!=1)){//前不破月后破月
return y*12+m;
}
else {//前破月后破月
return (y*12+m-1)<0?0:(y*12+m-1);
}
}

public int getDay(Date s,Date e){
if(s.after(e)){
Date t=s;
s=e;
e=t;
}
Calendar start = Calendar.getInstance();
start.setTime(s);
Calendar end = Calendar.getInstance();
end.setTime(e);
Calendar temp=Calendar.getInstance();
temp.setTime(e);
temp.add(Calendar.DATE,1);

if((start.get(Calendar.DATE)==1) && (temp.get(Calendar.DATE)==1)){//前后都不破月
return 0;
}
else if((start.get(Calendar.DATE)!=1) && (temp.get(Calendar.DATE)==1)){//前破月后不破月
return getDayP(start);
}
else if((start.get(Calendar.DATE)==1) && (temp.get(Calendar.DATE)!=1)){//前不破月后破月
return end.get(Calendar.DATE);
}
else {//前破月后破月
if(start.get(Calendar.MONTH)==end.get(Calendar.MONTH) && start.get(Calendar.YEAR)==end.get(Calendar.YEAR)){
return end.get(Calendar.DATE)-start.get(Calendar.DATE)+1;
}
else{
return getDayP(start)+end.get(Calendar.DATE);
}
}
}


public int getDayP(Calendar s){
int d;
if(s.get(Calendar.MONTH)==1 && s.get(Calendar.YEAR)%4==0 && s.get(Calendar.YEAR)%100!= 0){//闰年2月
d=29;
}
else{
Map<Integer,Integer> m = new HashMap<Integer, Integer>();
m.clear();
m.put(1, 31);
m.put(3, 31);
m.put(5, 31);
m.put(7, 31);
m.put(8, 31);
m.put(10, 31);
m.put(12, 31);
m.put(4, 30);
m.put(6, 30);
m.put(9, 30);
m.put(11, 30);
m.put(2, 28);
d=m.get(s.get(Calendar.MONTH)+1);
}
return d-s.get(Calendar.DATE)+1;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值