找出两个java.time.Instant对象之间的天数和月数的最佳方法是什么?

问题描述 投票:0回答:2

注意:在将此问题标记为重复之前搜索Google。我确实搜索并浏览了这个问题,发现的所有答案都针对LocalDate,Joda或旧版Java Date。

我花了很多时间对此进行调查,所以我决定将其分享为答案。

我想要一种方法来计算两个Java Instant(java.time.Instant的对象)之间的(大约)月数和天数?

java java-time
2个回答
0
投票

我选择了近似解决方案(假设所有月份都有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天,而是实际数字。


0
投票

首先,您要问的内容不清楚。例如,在瞬间2020-03-01T06:00:00Z和2020-03-31T05:00:00Z之间可以是:

  • 在澳大利亚/墨尔本时区为29天23小时;
  • 在欧洲/巴黎时区的30天;
  • 在美国/洛杉矶时区的1个月1天。

在给定时区的准确结果

    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天

© www.soinside.com 2019 - 2024. All rights reserved.