我正在尝试确定某个特定的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
4条答案
按热度按时间9njqaruj1#
您观察到的行为是由于Java中isBefore和isAfter方法在LocalTime类中的工作方式。
在LocalTime类中,isBefore方法将LocalTime对象表示的时间与另一个LocalTime对象进行比较。如果时间早于(即按时间顺序)指定的LocalTime,则isBefore方法返回true。相反,如果一天中的时间等于或晚于指定的LocalTime,则返回false。
在您的代码段中,您将startTime与LocalTime.MIDNIGHT进行比较,后者表示午夜(00:00)。由于startTime为23:00,按时间顺序,不在午夜(00:00)之前,因此isBefore方法返回false。
要实现所需的行为并检查班次的开始时间是否在午夜之前,可以按如下方式修改代码:
在这个修改后的代码中,我们使用isAfter方法进行startTime检查。由于23:00是在午夜之后,因此对于在午夜之前开始的班次,条件将评估为真。
类似地,endTime检查使用isBefore方法来确定班次的结束时间是否在午夜之前。由于07:00是在午夜之后,因此对于在午夜之后结束的班次,该条件将评估为真。
通过将这些条件与OR**(||)运算符,如果班次的开始或结束时间延迟到第二天,则该方法将返回true**。
请记住,LocalTime仅表示一天中的时间,而不考虑日期组件。如果您需要处理跨越不同日期的班次,则可能需要使用LocalDateTime或ZonedDateTime,其中包含日期和时间组件。
stszievb2#
根据文档,对于
isBefore
和isAfter
:比较基于一天内时间的时间线位置。
这些方法假设您正在比较的时间是在同一天,因此您不能使用这些方法来检查期间是否“出血”到第二天。
假设一个班次必须少于24小时,您可以通过检查结束是否在开始之前来检查它是否“流血”到第二天。这利用了
isBefore
的“假设两个时间在同一天”的特性。如果isBefore
认为endTime
在startTime
之前,那一定意味着endTime
在下一天。b09cbbtk3#
与所有事情一样,如果有疑问,请查看文档。
下面是代码各个部分的文档。
LocalTime#parse(String)
LocalTime#MIDNIGHT
LocalTime#isBefore(LocalTime)
其中最重要的是
LocalTime::isBefore
方法。看看上面写了什么粗体部分并不完全清楚,但这意味着,它将询问
23
是否在同一天0
***之前。更具体地,如果May 18 23:00在May 18 00:00之前。正如你所看到的,答案是假的,因为你不小心问了同一天。
您需要使用不同的工具,如
LocalDateTime
,才能解决此问题。如果你在使用这个工具时遇到问题,请告诉我,我可以发布一个示例。zzlelutf4#
LocalTime
只知道时间。它对日期一无所知。LocalTime.MIDNIGHT是The time of midnight at the start of the day, '00:00'.
。这就是为什么你的代码是这样工作的原因。因为
23:00
在00:00
之后。在…的情况下
因为
7:00
在00:00
之后您应该考虑使用LocalDateTime