Analog of ORACLE function MONTHS_BETWEEN in Java

后端 未结 8 544
时光说笑
时光说笑 2021-01-12 09:56

Does Java have some analog of Oracle\'s function MONTHS_BETWEEN?

8条回答
  •  难免孤独
    2021-01-12 10:24

    Actually, I think the correct implementation is this one:

    public static BigDecimal monthsBetween(final Date start, final Date end, final ZoneId zone, final int scale ) {
        final BigDecimal no31 = new BigDecimal(31);
    
        final LocalDate ldStart = start.toInstant().atZone(zone).toLocalDate();
        final LocalDate ldEnd = end.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    
        final int endDay = ldEnd.getDayOfMonth();
        final int endMonth = ldEnd.getMonthValue();
        final int endYear = ldEnd.getYear();
        final int lastDayOfEndMonth = ldEnd.lengthOfMonth();
    
        final int startDay = ldStart.getDayOfMonth();
        final int startMonth = ldStart.getMonthValue();
        final int startYear = ldStart.getYear();
        final int lastDayOfStartMonth = ldStart.lengthOfMonth();
    
        final BigDecimal diffInMonths = new BigDecimal((endYear - startYear)*12+(endMonth-startMonth));
        final BigDecimal fraction;
        if(endDay==startDay || (endDay==lastDayOfEndMonth && startDay==lastDayOfStartMonth)) {
            fraction = BigDecimal.ZERO;
        }
        else {
            fraction = BigDecimal.valueOf(endDay-startDay).divide(no31, scale, BigDecimal.ROUND_HALF_UP);
        }
        return diffInMonths.add(fraction);
    }
    
    public static BigDecimal monthsBetween(final Date start, final Date end) {
        return monthsBetween(start, end, ZoneId.systemDefault(), 20);
    }
    

提交回复
热议问题