代码之家  ›  专栏  ›  技术社区  ›  Rk R Bairi

检查LocalDateTime是否在时间范围内

  •  8
  • Rk R Bairi  · 技术社区  · 7 年前

    示例:如果时间B为下午4:00,则时间A应在下午2:30(-90)到下午5:30(+90)之间

    尝试了以下操作:

    if(timeA.isAfter(timeB.minusMinutes(90)) || timeA.isBefore(timeB.plusMinutes(90))) {
        return isInRange;   
    }
    

    你能帮我一下逻辑有什么问题吗?

    2 回复  |  直到 7 年前
        1
  •  10
  •   user7605325 user7605325    7 年前

    @JB Nizet said in the comments 操作员( || ).
    所以你在测试 A is after B - 90 A is before B + 90 . 如果只满足其中一个条件,则返回 true .

    检查是否 A 操作员( && ):

    if (timeA.isAfter(timeB.minusMinutes(90)) && timeA.isBefore(timeB.plusMinutes(90))) {
        return isInRange;   
    }
    

    但是上面的代码没有返回 真的 如果 确切地 90分钟之前或之后 B . 如果你想退货 当差值正好为90分钟时,您必须更改条件以检查:

    // lower and upper limits
    LocalDateTime lower = timeB.minusMinutes(90);
    LocalDateTime upper = timeB.plusMinutes(90);
    // also test if A is exactly 90 minutes before or after B
    if ((timeA.isAfter(lower) || timeA.equals(lower)) && (timeA.isBefore(upper) || timeA.equals(upper))) {
        return isInRange;
    }
    

    另一种选择是使用 java.time.temporal.ChronoUnit 要了解 A. B 在分钟内,并检查其值:

    // get the difference in minutes
    long diff = Math.abs(ChronoUnit.MINUTES.between(timeA, timeB));
    if (diff <= 90) {
        return isInRange;
    }
    

    Math.abs 因为如果 A. 在之后 B if (diff < 90) 如果要排除 “等于90分钟” 案例


    两种方法之间存在差异。

    ChronoUnit 舍入差异。e、 g.如果 A. 是90分59秒之后 ,差值将四舍五入到90分钟 if (diff <= 90) 真的 ,使用时 isBefore equals 将返回 false .

        2
  •  1
  •   Maddin Michael Kay    3 年前

    LocalDateTime实现了可比较的接口。为什么不使用它来检查值是否在如下范围内:

    public static boolean within(
        @NotNull LocalDateTime toCheck, 
        @NotNull LocalDateTime startInterval, 
        @NotNull LocalDateTime endInterval) 
    {
        return toCheck.compareTo(startInterval) >= 0 && toCheck.compareTo(endInterval) <= 0;
    }