我想知道两次约会之间有多少个月。我的代码现在是这样的
ChronoUnit.MONTHS.between(d1, d2)
问题是,结果是一个漫长的过程。例如,如果日期只有几天不同,我应该得到类似于0.34而不是0的结果。
此外,我需要我的代码来说明日历,我不能假设每个月有31天。
Diff between 1999-05-12 and 1999-08-24
Assuming all months have 31 days for simplicity
result = (19/31 + 31/31 + 31/31 + 24/31) = 2.793
According to the calendar we replace the 31s with the correct number of days for that specific year and month
2条答案
按热度按时间mf98qq941#
以下是我的解决方案:
其想法是使用时间调节器找到
start
月份的最后一天(lastDayOfStartMonth
)和end
月份的第一天(firstDayOfEndMonth
)。这两个日期非常重要。您想要的数字是:start
和lastDayOfStartMonth
之间的月份分数lastDayOfStartMonth
至firstDayOfEndMonth
之间的完整月数。firstDayOfEndMonth
和end
之间的月份分数。还有一种边缘情况,即两个日期都在同一个月内,这很容易处理。
通过使用这个定义,保持了任意两个月的第一天之间的月数始终是整数的良好性质。
请注意,在第一个计算中,您必须将一天加到
lastDayOfStartMonth
上,因为ChronoUnit.between
将上限视为独占,但我们在这里实际上希望将其视为一天。cnh2zyt32#
要解决此问题,您需要考虑以下情况:
如果日期属于同一年和月,则结果是两个日期之间的天数除以这个月的天数,可以使用
LocalDate.lengthOfMonth()
找到。在一般情况下,日期范围可以分为三个部分:
**两个小数部分在给定日期范围的开始和结束处(对于最简单的情况,当两个数据属于相同的年/月*时,都可以使用该方法进行计算)
*全部,我们可以用
ChronoUnit.MONTHS.between()
来计算它。下面是实现的方式(
d1
-包括,d2
-不包括):