Я использую приведенный ниже код, чтобы проверить, находится ли час между двумя другими конкретными часами:
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
. Как это решить?
Вы пометили свой вопрос с помощью java 8, поэтому взгляните на LocalTime и другие подобные классы, представленные в этой версии JDK.
@JoakimDanielson Это то, что я безуспешно делал в последние часы :(
@MichaelPlatt Я не уверен, что понимаю. Да, 02:00 AM
второй день, но мой currentHour
между ними. Вы говорите добавить день, где, как?
Вы можете добавить день, используя такой класс, как LocalDateTime
Так что это довольно сложно объяснить через текст, но я попытаюсь. Ваша ценность close
заключается в том, чтобы получить экземпляр объекта календаря и просто правильно установить время? Это означает, что ваши open
, current
и close
установлены на текущую дату. Это означает, что вы смотрите на open
равным 4/9/2019 0800 AM
и близким к 4/9/2019 0200AM
. Когда вы запускаете проверку, ваш current
установлен на 4/9/2019 1000PM
не раньше close
, потому что close
установлен на 02:00 утра того же дня, что и current
. Это имеет больше смысла?
@MichaelPlatt Теперь я это вижу. Не могли бы вы дать ответ, как мне добавить день? Спасибо!
Ответ, данный Ричардом, должен стать хорошей отправной точкой для начала работы. Если это работает, не забудьте отметить его как принятый ответ, чтобы другие могли его увидеть :-)
@MichaelPlatt Только что решил это, используя ответ Ричарда Уилдона. Большое спасибо, что нашли время, чтобы объяснить эту проблему.
@MichaelPlatt Да, ты прав. Только что принял ответ Ричарда Уилдона. Спасибо еще раз.
К вашему сведению, ужасно проблемные классы даты и времени, такие как java.util.Date
, java.util.Calendar
и java.text.SimpleDateFormat
, теперь являются наследие, вытесненными классами Java.время, встроенными в Java 8 и более поздние версии. См. Руководство от Oracle.
Просто нужно перемотать день, как предложил Майкл Платт:
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!");
}
}
}
Это сработало. Спасибо, что нашли время ответить на мой вопрос. Еще один небольшой вопрос, если я поменяю closeHour
скажем на 01:00 AM
, снова не работает, знаете почему?
Это решение менее оптимально. Он злоупотребляет классами даты и времени для хранения значений только времени суток. И он игнорирует важнейшую проблему часовых поясов, которые применяются неявно, используя текущий часовой пояс JVM по умолчанию, поэтому ваши результаты могут отличаться во время выполнения. У нас есть современный класс для этой работы: LocalTime
. Так что используйте его. См. Ответ Дэниэлсона.
@BasilBourque Спасибо за указание на современное решение.
Вот решение с использованием 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");
}
Вау, решил всю мою проблему. Это то, что я искал. Большое спасибо!
Возможно, это связано с тем фактом, что ваша программа видит
02:00AM
в тот же день? Если бы это было так, вы говорите, что время закрытия02:00 AM
сегодня, но время открытия08:00 AM
в тот же день. Вам нужно будет добавить день к вашему закрытию времени, если это был следующий день.