大家好,又见面了,我是你们的朋友全栈君。
就日历而言,您的问题是可以理解的:这两个比较代表一个完整的月。
但是
java.time.temporal.ChronoUnit.between
不是以这种方式推理,而是以
成套设备
.
根据它的javadoc,结果是预期的:
计算返回一个整数,表示
两个时间单位之间的完整单位
. 例如,中的金额
从11:30到13:29的时间只有一个小时
一分钟差两个小时。
这个
LocalDate.until
javadoc,由
ChronoUnit.between()
对您的案例来说更为明确,并给出了一个有趣的例子
between()
用于
MONTHS
作为
TemporalUnit
:
计算返回一个整数,表示
两个日期之间的完整单位。例如,中的金额
2012年6月15日至2012年8月14日之间的月份仅为一个月
比两个月少一天。
在您的工作示例中:
LocalDate startDate=LocalDate.of(2018,01,31);
LocalDate endDate=LocalDate.of(2018,7,31);
long noOfMonths = MONTHS.between(startDate,endDate);
你有
31 days of month / 31 days of month, on 6 months
= & gt;
6 months
.
在你失败的例子中:
LocalDate startDate=LocalDate.of(2018,01,31);
LocalDate endDate=LocalDate.of(2018,6,30);
long noOfMonths = MONTHS.between(startDate,endDate);
你有
30 days of month / 31 days of month, on 5 months
= & gt;
4 months + 1 month short of 1 day
& =;
4 months
(四舍五入)
如果你想写这样的东西:
LocalDate startDate=LocalDate.of(2018,01,30);
LocalDate endDate=LocalDate.of(2018,6,30);
long noOfMonths = MONTHS.between(startDate,endDate);
你会的
30 days of month / 30 days of month, on 5 months
= & gt;
5 months
.
关于你的问题:
有别的办法吗?
最简单的方法是:将“月日”设置为
1
或者两个日期中的同一个数字。
如果不适合您的要求,您可以检查这两个日期是否是当前月份的最后一天,在这种情况下,将其设置为相同的月份值。
你可以写一些像:
int lastMonthStart = startDate.getMonth()
.length(startDate.isLeapYear());
int lastMonthEnd = endDate.getMonth()
.length(endDate.isLeapYear());
if (startDate.getDayOfMonth() == lastMonthStart && endDate.getDayOfMonth() == lastMonthEnd) {
startDate = startDate.withDayOfMonth(1);
endDate = endDate.withDayOfMonth(1);
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159762.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...