场景:根据已经知道的日期1,日期2,按照业务场景计算得到日期2的值;
举例说明:比如说当前我要去银行贷款,每一个月还款,已知我开始还款日期为:2018-1-31那么请问我本年度的还款计划对应的日期是什么,同时如果当前是2018-1-30那么得到的日期是什么?
如果使用日历函数 Calendar:
Calendar c1 = Calendar.getInstance();
c1.setTime(dto.getRateValidFrom());
c1.add(calendar.MONTH, pFre);
pFre为增加的月份当前值为1;
然后得到的还款计划的日期为:2018-1-31,2018-2-28,2018-3-28后面都是每个月的28号;
如果是2018-1-30,那么应该是:2018-1-30,2018-2-28,2018-3-31,2018-4-30,2018-5-31,2018-6-30,2018-7-31等等都是月末。
可能上述日历函数的算法不适用于某些场景,也许我当前的日期是2018-1-31代表的是月末,那么我后面每个月都应该对应月末,而不是到了2月28号以后变成28号;
因此需要自己去写一个公用日期类:
judgeDate是初始日期,比如说:上述的2018-1-31,currentDate是通过计算后的日期,比如说:上述的 c1。
/**
* 对于judgeDate进行判断是否是月末,然后对currentDate做出日期矫正
* 举例说明:1-31,2-28,3-31,4-30 --judgeDate是月末的情况
* 1-30,2-28,3-30,4-30 --judgeDate不是月末的情况
* @param judgeDate
* @param currentDate
* @return
*/
public static Date calcEndOfMonth(Date judgeDate, Date currentDate) throws ParseException {
//1.校验judgeDate是否是月末
Boolean flag=isEndOfMonth(judgeDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 0);
String lastDay=sdf.format(calendar.getTime());
//获取currentDate的年,月
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH)+1;
//如果是月末,那么currentDate应该获取的是该月份的月末
if(flag){
currentDate=sdf.parse(lastDay);
}else{
//如果不是月末,判断当前月份的最大day<judgeDate的day?day:judgeDate的day
int b=calendar.getActualMaximum(Calendar.DATE);
calendar.setTime(judgeDate);
int a=calendar.get(Calendar.DAY_OF_MONTH);
currentDate=b<a?currentDate:sdf.parse(year+"-"+month+"-"+a);
}
return currentDate;
}
调用方法:该方法是判断传入的日期是否是该月的月末,比如说2018-1-31就是月末,2018-1-30就不是月末
private static Boolean isEndOfMonth(Date date){
// 获取Calendar实例
Calendar calendar = Calendar.getInstance();
//设置时间
calendar.setTime(date);
int b=calendar.get(Calendar.DAY_OF_MONTH);
//获取本月最大日期
int a=calendar.getActualMaximum(Calendar.DATE);
if(a==b){
return true;
}else{
return false;
}
}
测试主函数:
public static void main(String [] args) throws ParseException {
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份:");
int year = sc.nextInt();
System.out.print("请输入月份:");
int month = sc.nextInt();
System.out.print("请输入日:");
int day = sc.nextInt();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date=sdf.parse(year+"-"+month+"-"+day);
Boolean flag=HlsCusEndOfMonth.isEndOfMonth(date);
System.out.println(flag);
System.out.print("请输入第二年份:");
int year1 = sc.nextInt();
System.out.print("请输入第二月份:");
int month1 = sc.nextInt();
System.out.print("请输入第二个日:");
int day1 = sc.nextInt();
Date date1=sdf.parse(year1+"-"+month1+"-"+day1);
Date date2=HlsCusEndOfMonth.calcEndOfMonth(date,date1);
System.out.println(sdf.format(date2));
}