java 计算乔达时间的月差
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6844061/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Calculate month difference in Joda Time
提问by Bart van Heukelom
At the 4th line of code (ignore whitespace & comments) and beyond I'm calculating the month difference between 2 dates. This works, but looks a bit hacky. Is there a better way?
在第 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;
}
回答by Bozho
Months.monthsBetween(
start.withDayOfMonth(1),
end.withDayOfMonth(1)).getMonths()
回答by Sebastien Lorber
This is pretty similar to Bozho's solution:
这与 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();
}
回答by Bart van Heukelom
This is the solution I came up with when commenting on Bozho
这是我在评论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;
}