Java -如何检查LocalTime对象是否在午夜之前

h43kikqp  于 2023-05-21  发布在  Java
关注(0)|答案(4)|浏览(265)

我正在尝试确定某个特定的LocalTime是否在午夜之前。基本上,我想知道一个班次的开始/结束时间是否会延续到第二天。例如,如果班次安排在23:00 - 07:00,则这将被视为出血到第二天,因为结束时间在午夜之后,开始时间在午夜之前。
我通过查看开始时间是否在午夜之前,以及结束时间是否在午夜之后来开始实现这一点。这将符合重叠到第二天的标准。
在Java中,我的代码看起来像这样

public boolean checkTime() {
        
        final LocalTime startTime = LocalTime.parse("23:00");
        final LocalTime endTime = LocalTime.parse("07:00");

        return startTime.isBefore(LocalTime.MIDNIGHT) //false
                && endTime.isAfter(LocalTime.MIDNIGHT)) //true;
}

为什么它返回false,因为开始时间不是在午夜之前?23点不是离午夜还有一个小时吗我希望它返回true。也许我误解了什么?我正在使用LocalTimes而不是LocalDateTimes

9njqaruj

9njqaruj1#

您观察到的行为是由于Java中isBeforeisAfter方法在LocalTime类中的工作方式。
LocalTime类中,isBefore方法将LocalTime对象表示的时间与另一个LocalTime对象进行比较。如果时间早于(即按时间顺序)指定的LocalTime,则isBefore方法返回true。相反,如果一天中的时间等于或晚于指定的LocalTime,则返回false。
在您的代码段中,您将startTimeLocalTime.MIDNIGHT进行比较,后者表示午夜(00:00)。由于startTime为23:00,按时间顺序,不在午夜(00:00)之前,因此isBefore方法返回false
要实现所需的行为并检查班次的开始时间是否在午夜之前,可以按如下方式修改代码:

public boolean checkTime() {
    final LocalTime startTime = LocalTime.parse("23:00");
    final LocalTime endTime = LocalTime.parse("07:00");

    return startTime.isAfter(LocalTime.MIDNIGHT)
            || endTime.isBefore(LocalTime.MIDNIGHT);
}

在这个修改后的代码中,我们使用isAfter方法进行startTime检查。由于23:00是在午夜之后,因此对于在午夜之前开始的班次,条件将评估为真。
类似地,endTime检查使用isBefore方法来确定班次的结束时间是否在午夜之前。由于07:00是在午夜之后,因此对于在午夜之后结束的班次,该条件将评估为真。
通过将这些条件与OR**(||)运算符,如果班次的开始或结束时间延迟到第二天,则该方法将返回true**。
请记住,LocalTime仅表示一天中的时间,而不考虑日期组件。如果您需要处理跨越不同日期的班次,则可能需要使用LocalDateTimeZonedDateTime,其中包含日期和时间组件。

stszievb

stszievb2#

根据文档,对于isBeforeisAfter
比较基于一天内时间的时间线位置。
这些方法假设您正在比较的时间是在同一天,因此您不能使用这些方法来检查期间是否“出血”到第二天。
假设一个班次必须少于24小时,您可以通过检查结束是否在开始之前来检查它是否“流血”到第二天。这利用了isBefore的“假设两个时间在同一天”的特性。如果isBefore认为endTimestartTime之前,那一定意味着endTime在下一天。

endTime.isBefore(startTime)
b09cbbtk

b09cbbtk3#

与所有事情一样,如果有疑问,请查看文档。
下面是代码各个部分的文档。

  • LocalTime#parse(String)
  • LocalTime#MIDNIGHT
  • LocalTime#isBefore(LocalTime)

其中最重要的是LocalTime::isBefore方法。看看上面写了什么

  • 检查此时间是否在指定时间之前。比较基于时间在一天内的时间线位置。*

粗体部分并不完全清楚,但这意味着,它将询问23是否在同一天0***之前。
更具体地,如果May 18 23:00在May 18 00:00之前。正如你所看到的,答案是假的,因为你不小心问了同一天。
您需要使用不同的工具,如LocalDateTime,才能解决此问题。如果你在使用这个工具时遇到问题,请告诉我,我可以发布一个示例。

zzlelutf

zzlelutf4#

LocalTime只知道时间。它对日期一无所知。LocalTime.MIDNIGHT是The time of midnight at the start of the day, '00:00'.。这就是为什么你的代码是这样工作的原因。

startTime.isBefore(LocalTime.MIDNIGHT) == false

因为23:0000:00之后。
在…的情况下

endTime.isAfter(LocalTime.MIDNIGHT)) == true

因为7:0000:00之后
您应该考虑使用LocalDateTime

相关问题