日历函数工具类:计算下一个月份的日期

场景:根据已经知道的日期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));
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值