一尘不染

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

java


我有两个约会:

  • 开始日期: "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,它可以工作。它会返回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);

阅读 478

收藏
2020-12-03

共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

@OlivierGrégoire 编辑评论:

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

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