为什么我在 Java 中得到两个日期之间的差异?

问题描述 投票:0回答:1
Period period = new Period(startDate, endDate, PeriodType.yearMonthDay());

int years = period.getYears();
int months = period.getMonths();
int days = period.getDays();

如果开始日期 = 1975 年 5 月 1 日且结束日期 = 2024 年 4 月 5 日
年 = 48,月 = 11,天 = 4

但是如果 startDate = 1975 年 4 月 30 日且 endDate 为 2024 年 4 月 5 日
年 = 48,月 = 11,天 = 6

为什么相差2天?预计天数 = 5!

使用joda时间库

java android jodatime
1个回答
0
投票

java.time

2014 年 3 月,Java 8 引入了现代日期时间 API

java.time
。从那时起,建议从标准库中的旧版日期时间 API 以及 Joda-Time 切换到
java.time
API。下面是Joda-Time主页上的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到

java.time
(JSR-310) - JDK 的核心部分,它将取代它 项目。

了解如何执行计算非常重要: 如果结束日期天数小于开始日期天数,则该月份首先提升到下个月,然后借用总天数添加到结束日期天。

让我们通过一个例子来理解它。假设结束日期是 2024 年 5 月 5 日,开始日期是 1975 年 5 月 28 日。结束日期有 5 天,开始日期有 28 天;因此,5 月晋升为 6 月,有 30 天。当从 6 月借一个月时,借了 30 天(因为 6 月有 30 天)。因此,30 + 5 - 28 = 7 天。

演示

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d/M/uuuu");
        LocalDate endDate = LocalDate.parse("5/05/2024", dtf);
        LocalDate startDate = LocalDate.parse("28/05/1975", dtf);
        Period period = startDate.until(endDate);
        System.out.printf("%d years, %d months, %d days%n", period.getYears(), period.getMonths(), period.getDays());
    }
}

输出

48 years, 11 months, 7 days

在线演示

我们再举一个例子。假设结束日期是 2024 年 4 月 5 日,开始日期是 1975 年 4 月 30 日。结束日期有 5 天,开始日期有 30 天;这样,4 月就升为 5 月,5 月有 31 天。当从 May 借一个月时,借了 31 天(因为 May 有 31 天)。因此,31 + 5 - 30 = 6 天。

演示

输出

48 years, 11 months, 6 days

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

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