注意:在将此问题标记为重复之前搜索Google。我确实搜索并浏览了这个问题,发现的所有答案都针对LocalDate,Joda或旧版Java Date。
我花了很多时间对此进行调查,所以我决定将其分享为答案。
我想要一种方法来计算两个Java Instant(java.time.Instant的对象)之间的(大约)月数和天数?
我选择了近似解决方案(假设所有月份都有30.44天)。我已选择使用类似这样的内容:
Duration duration = Duration.between(instant1, instant2).abs(); /* if want negative values remove .abs() */
long hours = duration.toHours();
double daysAndMonthsInDays = hours / 24.0;
int months = daysAndMonthsInDays / 30.44; //average number of days per month
int days = daysAndMonthsInDays - months * 30.44;
如果使用Duration类或其他方法有更好的解决方案,请发布另一个答案。我决定不将Instant转换为LocalDate并在该级别上执行转换。那不会使用一个月中大约30.44天,而是实际数字。
首先,您要问的内容不清楚。例如,在瞬间2020-03-01T06:00:00Z和2020-03-31T05:00:00Z之间可以是:
ZoneId zone = ZoneId.of("America/Los_Angeles");
Instant start = Instant.parse("2020-03-01T06:00:00Z");
Instant end = Instant.parse("2020-03-31T05:00:00Z");
ZonedDateTime startZdt = start.atZone(zone);
LocalDate startDate = startZdt.toLocalDate();
ZonedDateTime endZdt = end.atZone(zone);
LocalDate endDate = endZdt.toLocalDate();
Period p = Period.between(startDate, endDate);
if (startZdt.plus(p).isAfter(endZdt)) {
// The time of day on the end date is earlier, so don’t count a full date
endDate = endDate.minusDays(1);
p = Period.between(startDate, endDate);
}
System.out.println(p);
输出:
P1M1D
阅读为期1个月1天。
[尽量将计算留给java.time。这包括一个月的估计时间。
Duration diff = Duration.between(start, end);
Duration durationOfAMonth = ChronoUnit.MONTHS.getDuration();
long months = diff.dividedBy(durationOfAMonth);
diff = diff.minus(durationOfAMonth.multipliedBy(months));
long days = diff.toDays();
System.out.println("" + months + " months " + days + " days");
0个月29天