java months between,java 8-chronounit.months.between(fromdate,todate)不能按预期工作

就日历而言,您的问题是可以理解的:这两个比较代表一个完整的月。

但是

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值