【问题标题】:How do I subtract a localDate from another LocalDate如何从另一个 LocalDate 中减去一个 localDate
【发布时间】:2020-04-29 12:03:24
【问题描述】:

我正在尝试计算 2 个 localDates 之间的天数

我从这个答案中获得灵感:https://stackoverflow.com/a/325964 这个问题Determine Whether Two Date Ranges Overlap

问题是,这个问题使用了我认为已经过时的 dateTime,因此使用 localDate 的原因。

有没有人知道使用 localDate 来实现上述答案中算法的类似方法。

减法不允许减去另一个localDate。

我尝试过使用

ChoronoUnit.DAYS.between(LD1, LD2.plusDays(1)) //include the final day in the count

但有时这会产生负数,因此算法会中断,因为它选择最小的数字作为重叠天数

【问题讨论】:

  • 什么是“答案”?
  • 代码示例似乎是正确的。 “算法失败”到底是什么意思?你的问题有点不清楚:-)
  • 我已经编辑了问题
  • 如果ChronoUnit.DAYS.between(ld1, ld2) 返回一个负数,那么ld1.isAfter(ld2) 必须返回true。您可以通过始终将未来日期作为第二个参数来轻松停止获得负数,或者更简单,只需使用 days = Math.abs(days)
  • @3rdRockSoftware 在链接的答案中,解释一下,它说:“如果开始和结束日期可能有问题,...使用Min()Max()” i>,如ChoronoUnit.DAYS.between(Math.min(LD1, LD2), Math.max(LD1, LD2)) + 1Slaw's comment 是更好的解决方案:Math.abs(ChoronoUnit.DAYS.between(LD1, LD2)) + 1

标签: java datetime localdate date-comparison


【解决方案1】:

Andreas 已经在评论中给出了答案:您需要先取日差的绝对值,然后加 1 使计数包括开始日期和结束日期。

public static long daysBetweenInclusive(LocalDate ld1, LocalDate ld2) {
    return Math.abs(ChronoUnit.DAYS.between(ld1, ld2)) + 1;
}

让我们试试吧:

    LocalDate ld1 = LocalDate.of(2020, Month.MAY, 4);
    System.out.println(daysBetweenInclusive(ld1, LocalDate.of(2020, Month.MAY, 2)));
    System.out.println(daysBetweenInclusive(ld1, ld1));
    System.out.println(daysBetweenInclusive(ld1, LocalDate.of(2020, Month.MAY, 7)));

输出:

3
1
4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    相关资源
    最近更新 更多