Получение неверного результата при проверке даты между двумя другими датами в Java - PullRequest
1 голос
/ 09 апреля 2019

Я использую код ниже, чтобы проверить, находится ли час между двумя другими определенными часами:

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", код не будет работать должным образом, даже если currentHour находится между 08:00 AM и 02:00 AM. Как это решить?

Ответы [ 2 ]

4 голосов
/ 09 апреля 2019

Вот решение, использующее 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");
}
2 голосов
/ 09 апреля 2019

Просто нужно провести день, как предложил Майкл Платт:

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!");
    }
  }
}
...