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

新手上路,请多包涵

请注意,这不是以下任何一项的副本


我有两个日期:

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

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

非常感谢你的帮助。

方法一:

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

方法二:

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

方法三:

我尝试使用 Joda 库而不是 Java 8 API,它有效。它会返回 3,看起来 Java duration months 计算也使用了 days 值。但就我而言,我不能在我的项目中使用 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);

原文由 SharpLu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

因为你不关心你的情况。您只需要两个日期之间的月数,使用期间的文档来调整日期,它使用了 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 Grégoire 的评论:

我们可以使用不使用天单位的 YearMonth 而不是使用 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

原文由 AxelH 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Java8 开始:

 ChronoUnit.MONTHS.between(startDate, endDate);

原文由 Zon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题