Java 8 计算两个日期之间的月份

2022-08-31 20:54:23

注意:这不是以下任一项的副本


我有两个日期:

  • 开始日期:"2016-08-31"
  • 结束日期:"2016-11-30"

它在上述两个日期之间的91天持续时间,我期望我的代码返回3个月的持续时间,但下面的方法只返回2个月。有人有更好的建议吗?还是你们认为这是Java 8中的一个错误?91天的持续时间仅返回2个月。

非常感谢您的帮助。

方法 1:

Period diff = Period.between(LocalDate.parse("2016-08-31"),
    LocalDate.parse("2016-11-30"));

方法 2:

long daysBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2016-08-31"),
    LocalDate.parse("2016-11-30"));

方法 3:

我试图使用Joda库而不是Java 8 API,它的工作原理。它 loos 将返回 3,它看起来像 Java 持续时间月计算也使用了天数值。但在我的情况下,我不能在我的项目中使用Joda。所以仍然在寻找其他解决方案。

    LocalDate dateBefore= LocalDate.parse("2016-08-31");
    LocalDate dateAfter = LocalDate.parse("2016-11-30");
    int months = Months.monthsBetween(dateBefore, dateAfter).getMonths();
    System.out.println(months);

答案 1

因为你不在乎你的情况。您只需要两个日期之间的月数,使用期间的文档来调整日期,它使用的日期如.只需将两个实例的天数设置为相同的值(当月的第一天)Jacob

Period diff = Period.between(
            LocalDate.parse("2016-08-31").withDayOfMonth(1),
            LocalDate.parse("2016-11-30").withDayOfMonth(1));
System.out.println(diff); //P3M

与其他解决方案相同:

long monthsBetween = ChronoUnit.MONTHS.between(
        LocalDate.parse("2016-08-31").withDayOfMonth(1),
        LocalDate.parse("2016-11-30").withDayOfMonth(1));
System.out.println(monthsBetween); //3

编辑自@Olivier格雷瓜尔评论:

我们可以使用不使用天数单位的 YearMonth,而不是使用 a 并将日期设置为月的第一天。LocalDate

long monthsBetween = ChronoUnit.MONTHS.between(
     YearMonth.from(LocalDate.parse("2016-08-31")), 
     YearMonth.from(LocalDate.parse("2016-11-30"))
)
System.out.println(monthsBetween); //3

答案 2

从Java8开始:

ChronoUnit.MONTHS.between(startDate, endDate);

推荐