Проверьте, лежит ли данное время между двумя временами независимо от даты
У меня есть временные интервалы:
String time1 = 01:00:00
String time2 = 05:00:00
Я хочу проверить, находятся ли между ними time1 и time2 20:11:13 and 14:49:00
.
На самом деле, 01:00:00
больше, чем 20:11:13
и меньше, чем 14:49:00
учитывая 20:11:13
, всегда меньше, чем 14:49:00
. Это заданное предварительное условие.
Итак, чего я хочу, 20:11:13 < 01:00:00 < 14:49:00
.
Итак, мне нужно что-то подобное:
public void getTimeSpans()
{
boolean firstTime = false, secondTime = false;
if(time1 > "20:11:13" && time1 < "14:49:00")
{
firstTime = true;
}
if(time2 > "20:11:13" && time2 < "14:49:00")
{
secondTime = true;
}
}
Я знаю, что этот код не дает правильного результата, поскольку я сравниваю объекты string.
Как это сделать, поскольку это временные интервалы, а не строки для сравнения?
Переведено автоматически
Ответ 1
Вы можете использовать Calendar
класс для проверки.
Например:
try {
String string1 = "20:11:13";
Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(time1);
calendar1.add(Calendar.DATE, 1);
String string2 = "14:49:00";
Date time2 = new SimpleDateFormat("HH:mm:ss").parse(string2);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(time2);
calendar2.add(Calendar.DATE, 1);
String someRandomTime = "01:00:00";
Date d = new SimpleDateFormat("HH:mm:ss").parse(someRandomTime);
Calendar calendar3 = Calendar.getInstance();
calendar3.setTime(d);
calendar3.add(Calendar.DATE, 1);
Date x = calendar3.getTime();
if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
//checkes whether the current time is between 14:49:00 and 20:11:13.
System.out.println(true);
}
} catch (ParseException e) {
e.printStackTrace();
}
Ответ 2
tl; dr
20:11:13 < 01:00:00 < 14:49:00
LocalTime target = LocalTime.parse( "01:00:00" ) ;
Boolean targetInZone = (
target.isAfter( LocalTime.parse( "20:11:13" ) )
&&
target.isBefore( LocalTime.parse( "14:49:00" ) )
) ;
java.time.LocalTime
Классы java.time включают LocalTime
для представления времени суток только без даты и часового пояса.
Итак, чего я хочу, так это, 20:11:13 < 01:00:00 < 14:49:00.
Сначала мы определяем границы. Ваши входные строки соответствуют стандартным форматам ISO 8601. Классы java.time по умолчанию используют форматы ISO 8601, поэтому нет необходимости указывать шаблон форматирования.
LocalTime start = LocalTime.parse( "20:11:13" );
LocalTime stop = LocalTime.parse( "14:49:00" );
И определите наш тестовый пример, цель 01:00:00
.
LocalTime target = LocalTime.parse( "01:00:00" );
Теперь мы настроены на сравнение этих LocalTime
объектов. Мы хотим увидеть, находится ли цель после более позднего времени, но до более раннего. В данном случае это означает середину ночи, примерно между 8 часами вечера и 3 часами ночи следующего утра.
Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ;
Этот тест можно проще сформулировать как “не между 3 часами ночи и 8 часами вечера”. Затем мы могли бы обобщить на любую пару LocalTime
объектов, где мы проверяем between, если начало происходит до остановки с 24-часовыми часами, и не between, если начало происходит после остановки (как в случае с этим вопросом).
Более того, промежутки времени обычно обрабатываются с помощью полуоткрытого подхода, где начало является включающим, а окончание - исключающим. Таким образом, сравнение "между", строго говоря, было бы “является ли цель равной или более поздней, чем start, И цель находится перед stop”, или, проще говоря, “является ли цель не перед start И перед stop”.
Boolean isBetweenStartAndStopStrictlySpeaking =
( ( ! target.isBefore( start ) && target.isBefore( stop ) ) ;
Если начало происходит после остановки, в течение 24 часов, то предположим, что мы хотим логику, предложенную в Вопросе (после 8 часов вечера, но до 3 часов ночи).
if( start.isAfter( stop ) ) {
return ! isBetweenStartAndStopStrictlySpeaking ;
} else {
return isBetweenStartAndStopStrictlySpeaking ;
}
О java.time
Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые, вызывающие беспокойство, устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.
Проект Joda-Time, который сейчас находится в режиме обслуживания, рекомендует перейти на классы java.time.
Вы можете обмениваться объектами java.time непосредственно со своей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах. Поддержка Hibernate 5 и JPA 2.2 java.time.
Где взять классы java.time?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с комплексной реализацией.
- Java 9 содержит некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функций java.time перенесена обратно на Java 6 и 7 в трехпозиционном бэкпорте.
- Android
- Более поздние версии Android (26+) содержат реализации классов java.time.
- Для более ранних версий Android (<26) процесс удаления API приносит подмножество функций java.time, изначально не встроенных в Android.
- Если удаление данных не предлагает того, что вам нужно, проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) для Android. Смотрите Как использовать ThreeTenABP ....
Ответ 3
Ответ, данный @kocko, работает только в тот же день.
Если время начала "23:00: 00" и окончания "02: 00: 00"[на следующий день], а текущее время - "01: 30: 00", то результат будет ложным ...
Я изменил ответ @ kocko, чтобы он работал идеально
public static boolean isTimeBetweenTwoTime(String initialTime, String finalTime,
String currentTime) throws ParseException {
String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
if (initialTime.matches(reg) && finalTime.matches(reg) &&
currentTime.matches(reg))
{
boolean valid = false;
//Start Time
//all times are from java.util.Date
Date inTime = new SimpleDateFormat("HH:mm:ss").parse(initialTime);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(inTime);
//Current Time
Date checkTime = new SimpleDateFormat("HH:mm:ss").parse(currentTime);
Calendar calendar3 = Calendar.getInstance();
calendar3.setTime(checkTime);
//End Time
Date finTime = new SimpleDateFormat("HH:mm:ss").parse(finalTime);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(finTime);
if (finalTime.compareTo(initialTime) < 0)
{
calendar2.add(Calendar.DATE, 1);
calendar3.add(Calendar.DATE, 1);
}
java.util.Date actualTime = calendar3.getTime();
if ((actualTime.after(calendar1.getTime()) ||
actualTime.compareTo(calendar1.getTime()) == 0) &&
actualTime.before(calendar2.getTime()))
{
valid = true;
return valid;
} else {
throw new IllegalArgumentException("Not a valid time, expecting
HH:MM:SS format");
}
}
}
Вывод
"07:00:00" - "17:30:00" - "15:30:00" [current] - true
"17:00:00" - "21:30:00" - "16:30:00" [current] - false
"23:00:00" - "04:00:00" - "02:00:00" [current] - true
"00:30:00" - "06:00:00" - "06:00:00" [current] - false
(Я включил нижнее предельное значение в [верхнее предельное значение-1])
Ответ 4
Изменен код @Surendra Jnawali. Сбой
если текущее время равно 23:40: 00, т. е. больше времени начала и меньше, чем равно 23:59:59.
Все заслуги принадлежат реальному владельцу
Так и должно быть: это работает идеально
public static boolean isTimeBetweenTwoTime(String argStartTime,
String argEndTime, String argCurrentTime) throws ParseException {
String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
//
if (argStartTime.matches(reg) && argEndTime.matches(reg)
&& argCurrentTime.matches(reg)) {
boolean valid = false;
// Start Time
java.util.Date startTime = new SimpleDateFormat("HH:mm:ss")
.parse(argStartTime);
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(startTime);
// Current Time
java.util.Date currentTime = new SimpleDateFormat("HH:mm:ss")
.parse(argCurrentTime);
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(currentTime);
// End Time
java.util.Date endTime = new SimpleDateFormat("HH:mm:ss")
.parse(argEndTime);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endTime);
//
if (currentTime.compareTo(endTime) < 0) {
currentCalendar.add(Calendar.DATE, 1);
currentTime = currentCalendar.getTime();
}
if (startTime.compareTo(endTime) < 0) {
startCalendar.add(Calendar.DATE, 1);
startTime = startCalendar.getTime();
}
//
if (currentTime.before(startTime)) {
System.out.println(" Time is Lesser ");
valid = false;
} else {
if (currentTime.after(endTime)) {
endCalendar.add(Calendar.DATE, 1);
endTime = endCalendar.getTime();
}
System.out.println("Comparing , Start Time /n " + startTime);
System.out.println("Comparing , End Time /n " + endTime);
System.out
.println("Comparing , Current Time /n " + currentTime);
if (currentTime.before(endTime)) {
System.out.println("RESULT, Time lies b/w");
valid = true;
} else {
valid = false;
System.out.println("RESULT, Time does not lies b/w");
}
}
return valid;
} else {
throw new IllegalArgumentException(
"Not a valid time, expecting HH:MM:SS format");
}
}
Результат
Comparing , Start Time /n Thu Jan 01 23:00:00 IST 1970
Comparing , End Time /n Fri Jan 02 02:00:00 IST 1970
Comparing , Current Time /n Fri Jan 02 01:50:00 IST 1970
RESULT, Time lies b/w