检查 Java 中其他两个日期之间的日期时得到不正确的结果

Getting incorrect result when checking a date between two other dates in Java

我正在使用下面的代码来检查一个小时是否介于其他两个特定时间之间:

String openHour = "08:00 AM";
String currentHour = "10:00 PM";
String closeHour = "11:00 PM"; //Change to 02:00 AM doesn't work!!!

SimpleDateFormat format = new SimpleDateFormat("hh:mm a");
Date openHourDate = format.parse(openHour);
Date currentHourDate = format.parse(currentHour);
Date closeHourDate = format.parse(closeHour);

Calendar openCalendar = Calendar.getInstance();
openCalendar.setTime(openHourDate);

Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(currentHourDate);

Calendar closeCalendar = Calendar.getInstance();
closeCalendar.setTime(closeHourDate);

Date open = openCalendar.getTime();
Date current = currentCalendar.getTime();
Date close = closeCalendar.getTime();

if (current.after(open) && current.before(close)) {
    System.out.println("Correct!");
} else {
    System.out.println("Incorrect!");
}

如果 currentHour"10:00 PM",如您在我的代码中所见,一切正常,但如果我将其更改为 "02:00 AM",则代码无法按预期工作即使 currentHour08:00 AM02:00 AM 之间。如何解决?

正如迈克尔普拉特所建议的那样,只需要度过一天:

import java.util.*;
import java.text.*;

public class Foo {
  public static void main(String[] args) throws Exception {

    String openHour = "08:00 AM";
    String currentHour = "10:00 PM";
    String closeHour = "11:00 PM"; //Change to 02:00 AM doesn't work!!!

    SimpleDateFormat format = new SimpleDateFormat("hh:mm a");
    Date openHourDate = format.parse(openHour);
    Date currentHourDate = format.parse(currentHour);
    Date closeHourDate = format.parse(closeHour);

    Calendar openCalendar = Calendar.getInstance();
    openCalendar.setTime(openHourDate);

    Calendar currentCalendar = Calendar.getInstance();
    currentCalendar.setTime(currentHourDate);

    Calendar closeCalendar = Calendar.getInstance();
    closeCalendar.setTime(closeHourDate);

    if (closeCalendar.before(openCalendar)) {
      closeCalendar.add(Calendar.DAY_OF_YEAR, 1);
    }

    Date open = openCalendar.getTime();
    Date current = currentCalendar.getTime();
    Date close = closeCalendar.getTime();

    if (current.after(open) && current.before(close)) {
      System.out.println("Correct!");
    } else {
      System.out.println("Incorrect!");
    }
  }
}

这是一个使用 LocalTime 的解决方案,它也可以正确处理午夜后的当前时间和关闭时间。

String openHour = "08:00 AM";
String currentHour = "01:00 PM";
String closeHour = "02:00 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "hh:mm a" , Locale.US );
LocalTime openTime = LocalTime.parse(openHour, formatter);
LocalTime currentTime  = LocalTime.parse(currentHour, formatter);
LocalTime closeTime = LocalTime.parse(closeHour, formatter);

boolean isOpen = false;
if (closeTime.isAfter(openTime)) {
  if (openTime.isBefore(currentTime) && closeTime.isAfter(currentTime)) {
    isOpen = true;
  }
} else if (currentTime.isAfter(openTime) || currentTime.isBefore(closeTime)) {
  isOpen = true;
}

if (isOpen) {
  System.out.println("We are open");
} else {
  System.out.println("We are closed");
}