计算Joda Time的月差

在第4行代码(忽略空格和注释)以及我正在计算2个日期之间的月份差异。 这有效,但看起来有点hacky。 有没有更好的办法?

int handleAllowance(LocalDate today) { int allowance = membership.allowance(); if (allowance == 0) return 0; // if update was last month (or earlier) int months = today.monthOfYear().getMaximumValue() - today.monthOfYear().getMinimumValue(); // yeah, 12, but just to be 100% correct :-) int curMonth = (today.getYear() * months) + today. getMonthOfYear(); int updMonth = (lastAllowanceUpdate.getYear() * months) + lastAllowanceUpdate.getMonthOfYear(); if (curMonth > updMonth) { // ...and if today is on or past update day int updateDay = Math.min(allowanceDay, today.dayOfMonth().getMaximumValue()); if (today.getDayOfMonth() >= updateDay) { // number of months to give allowance (in the rare case this process fails to run for 2 months or more) int allowanceMonths = curMonth - updMonth; // give credits final int totalAllowance = allowance * allowanceMonths; giveCredits(totalAllowance); // update day lastAllowanceUpdate = lastAllowanceUpdate.plusMonths(allowanceMonths); // return the allowance given return totalAllowance; } } return 0; } 

 Months.monthsBetween( start.withDayOfMonth(1), end.withDayOfMonth(1)).getMonths() 

这与Bozho的解决方案非常相似:

  public static YearMonth toYearMonth(LocalDate localDate) { return new YearMonth(localDate.getYear(), localDate.getMonthOfYear()); } public static int monthSwitches(LocalDate date1,LocalDate date2) { return Months.monthsBetween(toYearMonth(date1),toYearMonth(date2)).getMonths(); } 

这是我在评论Bozho时提出的解决方案

 int handleAllowance(LocalDate today) { int allowance = membership.allowance(); if (allowance == 0) return 0; // calculate month difference int allowanceMonths = Months.monthsBetween(lastAllowanceUpdate.withDayOfMonth(1), today.withDayOfMonth(1)).getMonths(); // if update was last month or earlier if (allowanceMonths > 0) { // ...and if today is on or past update day int updateDay = Math.min(allowanceDay, today.dayOfMonth().getMaximumValue()); if (today.getDayOfMonth() >= updateDay) { // give credits (multiply with months in the rare case this process consecutively fails to run for 2 months or more) final int totalAllowance = allowance * allowanceMonths; giveCredits(totalAllowance); // update day lastAllowanceUpdate = lastAllowanceUpdate.plusMonths(allowanceMonths); // return the allowance given return totalAllowance; } } return 0; }