Compruebe si un tiempo determinado se encuentra entre dos veces, independientemente de la fecha

Tengo timespans:

String time1 = 01:00:00

String time2 = 05:00:00

Quiero verificar si 20:11:13 and 14:49:00 encuentran entre las 20:11:13 and 14:49:00 .

En realidad, 01:00:00 es mayor que 20:11:13 y menos de 14:49:00 considerando 20:11:13 siempre es menos de 14:49:00 . Esto es un requisito previo.

Entonces lo que quiero es, 20:11:13 < 01:00:00 < 14:49:00 .

Entonces necesito algo como eso:

  public void getTimeSpans() { boolean firstTime = false, secondTime = false; if(time1 > "20:11:13" && time1  "20:11:13" && time2 < "14:49:00") { secondTime = true; } } 

Sé que este código no da un resultado correcto ya que estoy comparando los objetos de cadena.

¿Cómo hacer eso, ya que son los intervalos de tiempo, pero no las cadenas para comparar?

Puede usar la clase Calendar para verificar.

Por ejemplo:

 try { String string1 = "20:11:13"; Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(time1); 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(); } 

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

Las clases java.time incluyen LocalTime para representar una hora del día solo sin una fecha y sin una zona horaria.

Entonces lo que quiero es, 20:11:13 <01:00:00 <14:49:00.

Primero definimos los límites. Sus cadenas de entrada cumplen con los formatos estándar ISO 8601 . Las clases java.time usan formatos ISO 8601 de forma predeterminada, por lo que no es necesario especificar un patrón de formateo.

 LocalTime start = LocalTime.parse( "20:11:13" ); LocalTime stop = LocalTime.parse( "14:49:00" ); 

Y define nuestro caso de prueba, el objective 01:00:00 .

 LocalTime target = LocalTime.parse( "01:00:00" ); 

Ahora estamos configurados para comparar estos objetos LocalTime . Queremos ver si el objective está después del tiempo posterior pero antes de la hora anterior. Eso significa que a media noche en este caso, entre aproximadamente las 8 p.m. y las 3 a.m. de la mañana siguiente.

 Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ; 

Esa prueba puede decirse más simplemente como ” no entre las 3 AM y las 8 PM”. Podríamos generalizar a cualquier par de objetos LocalTime donde LocalTime entre si el inicio llega antes de la parada con un reloj de 24 horas, y no entre si el inicio viene después de la detención (como en el caso de esta Pregunta).

Además, los períodos de tiempo se manejan generalmente con el enfoque de Medio Abierto, donde el comienzo es inclusivo, mientras que el final es exclusivo . Entonces, una comparación “entre”, estrictamente hablando, sería “es el objective igual o más tarde que el inicio Y el objective es antes de detenerse”, o más simplemente, “es el objective no antes del inicio Y antes de la detención”.

 Boolean isBetweenStartAndStopStrictlySpeaking = ( ( ! target.isBefore( start ) && target.isBefore( stop ) ) ; 

Si el inicio es posterior a la parada, dentro de un reloj de 24 horas, supongamos que queremos la lógica sugerida en la Pregunta (es después de las 8 PM pero antes de las 3 AM).

 if( start.isAfter( stop ) ) { return ! isBetweenStartAndStopStrictlySpeaking ; } else { return isBetweenStartAndStopStrictlySpeaking ; } 

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

La respuesta dada por @kocko funciona solo el mismo día.
Si la hora de inicio es “23:00:00” y finaliza “02:00:00” [día siguiente] y la hora actual es “01:30:00” , el resultado será falso …
Modifiqué la respuesta de @ kocko para que funcione a la perfección

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

Salida

 "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 

(He incluido el valor límite inferior a [valor límite superior-1])

Código modificado @Surendra Jnawali ‘. Falla

si la hora actual es 23:40:00 es decir, mayor que la hora de inicio y menor que igual a 23:59:59.

Todo el crédito va al verdadero dueño

Así es como debería ser: Esto funciona perfecto

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

RESULTADO

 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 
  Calendar now = Calendar.getInstance(); int hour = now.get(Calendar.HOUR_OF_DAY); // Get hour in 24 hour format int minute = now.get(Calendar.MINUTE); Date date = parseDate(hour + ":" + minute); Date dateCompareOne = parseDate("08:00"); Date dateCompareTwo = parseDate("20:00"); if (dateCompareOne.before( date ) && dateCompareTwo.after(date)) { //your logic } private Date parseDate(String date) { final String inputFormat = "HH:mm"; SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US); try { return inputParser.parse(date); } catch (java.text.ParseException e) { return new Date(0); } } 

Además, para ser más preciso, si compara un tiempo entre un intervalo de más de 00:00 a 24:00 de ese día, también debe analizar el día.

Me parece que su problema es una situación O … Quiere verificar si time1> 20:11:13 O time1 <14:49:00.

Nunca habrá un tiempo mayor a 20:11:13 que exceda su rango hasta el otro extremo (14:49:00) y viceversa. Piense en ello como si estuviera comprobando que el tiempo NO es entre un par de marcas de tiempo debidamente ordenadas.

El siguiente método verifica si ‘validateTime’ está entre ‘startTime’ y ‘endTime’ o no mientras se considera la posibilidad de que ‘endTime’ pueda ser al día siguiente. Para usarlo correctamente analizar las fechas en formato “HH: mm”.

  public static final boolean isBetweenValidTime(Date startTime, Date endTime, Date validateTime) { boolean validTimeFlag = false; if(endTime.compareTo(startTime) < = 0) { if(validateTime.compareTo(endTime) < 0 || validateTime.compareTo(startTime) >= 0) { validTimeFlag = true; } } else if(validateTime.compareTo(endTime) < 0 && validateTime.compareTo(startTime) >= 0) { validTimeFlag = true; } return validTimeFlag; } 

Después de leer algunas respuestas, creo que la escritura es demasiado complicada. Prueba mi código

  public static boolean compare(String system_time, String currentTime, String endtimes) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); Date startime = simpleDateFormat.parse("19:25:00"); Date endtime = simpleDateFormat.parse("20:30:00"); //current time Date current_time = simpleDateFormat.parse("20:00:00"); if (current_time.after(startime) && current_time.before(endtime)) { System.out.println("Yes"); return true; } else if (current_time.after(startime) && current_time.after(endtime)) { return true; //overlap condition check } else { System.out.println("No"); return false; } } catch (ParseException e) { e.printStackTrace(); } return false; } 

Al igual que con la ayuda de @kocko, el código de trabajo completo es el siguiente:

 try{ Date time11 = new SimpleDateFormat("HH:mm:ss").parse("20:11:13"); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(time11); Date time22 = new SimpleDateFormat("HH:mm:ss").parse("14:49:00"); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(time22); Date currentTime = new SimpleDateFormat("HH:mm:ss").parse("00:00:00"); Calendar startingCalendar = Calendar.getInstance(); startingCalendar.setTime(currentTime); startingCalendar.add(Calendar.DATE, 1); //let's say we have to check about 01:00:00 String someRandomTime = time1; Date d = new SimpleDateFormat("HH:mm:ss").parse(someRandomTime); Calendar calendar3 = Calendar.getInstance(); calendar3.setTime(d); if(startingCalendar.getTime().after(calendar1.getTime())) { calendar2.add(Calendar.DATE, 1); calendar3.add(Calendar.DATE, 1); } Date x = calendar3.getTime(); if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) { System.out.println("Time is in between.."); } else { System.out.println("Time is not in between.."); } } catch (ParseException e) { e.printStackTrace(); } 

separa dos puntos de las cadenas $ time, $ to y $ from, convierte a int y luego usa la siguiente condición para verificar si el tiempo está entre from y to. El ejemplo está en php, pero no debería importar.

 if(($to < $from && ($time >= $from || $time < = $to)) || ($time >= $from && $time < = $to)) { return true; } 

La función de trabajo real será la siguiente

 public static boolean isTimeBetweenTwoTime(Date startTime, Date stopTime, Date currentTime) { //Start Time Calendar StartTime = Calendar.getInstance(); StartTime.setTime(startTime); //Current Time Calendar CurrentTime = Calendar.getInstance(); CurrentTime.setTime(currentTime); //Stop Time Calendar StopTime = Calendar.getInstance(); StopTime.setTime(stopTime); if (stopTime.compareTo(startTime) < 0) { if (CurrentTime.compareTo(StopTime) < 0) { CurrentTime.add(Calendar.DATE, 1); } StopTime.add(Calendar.DATE, 1); } return CurrentTime.compareTo(StartTime) >= 0 && CurrentTime.compareTo(StopTime) < 0; } 

En su caso, la hora de inicio (20:11:13) es mayor que la hora de finalización (14:49:00). Es una suposición razonable que podría resolver el problema agregando un día en la hora de finalización o restando un día de la hora de inicio. Si lo hace, quedará atrapado porque no sabe en qué día es el momento de la prueba.

Puede evitar esta trampa comprobando si el tiempo de prueba es entre la hora de finalización y la hora de inicio. Si es verdadero, el resultado es “no intermedio”; else resultado es “bien intermedio”.

Aquí está la función en JAVA que he estado usando. Funciona tan lejos para mí. Buena suerte.

 boolean IsTimeInBetween(Calendar startC, Calendar endC, Calendar testC){ // assume year, month and day of month are all equal. startC.set(1,1,1); endC.set(1,1,1); testC.set(1,1,1); if (endC.compareTo(startC) > 0) { if ((testC.compareTo(startC)>=0) && (testC.compareTo(endC)< =0)) { return true; }else { return false; } }else if (endC.compareTo(startC) < 0) { if ((testC.compareTo(endC) >= 0) && (testC.compareTo(startC) < = 0)) { return false; } else { return true; } } else{ // when endC.compareTo(startC)==0, I return a ture value. Change it if you have different application. return true; } } 

Para crear una instancia de Calender, puede usar:

 Calendar startC = Calendar.getInstance(); startC.set(Calendar.HOUR_OF_DAY, 20); startC.set(Calendar.MINUTE,11); startC.set(Calendar.SECOND,13); 

Java 8 – LocalDateTime

¿Qué hay de esto?

 final LocalDateTime now = LocalDateTime.now(); final LocalDateTime minRange = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 22, 30); //Today, 10:30pm LocalDateTime maxRange = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 6, 30); //Tomorrow, 6:30am maxRange = maxRange.plusDays(1); //Ensures that you don't run into an exception if minRange is the last day in the month. if (now.isAfter(minRange) && now.isBefore(maxRange)) { //Action } 

El uso de LocalTime simplemente ignoraría el valor de la Fecha:

 public class TimeIntervalChecker { static final LocalTime time1 = LocalTime.parse( "20:11:13" ) ; static final LocalTime time2 = LocalTime.parse( "14:49:00" ) ; public static void main(String[] args) throws java.lang.Exception { LocalTime nowUtcTime = LocalTime.now(Clock.systemUTC()); if (nowUtcTime.isAfter(time1) && nowUtcTime.isBefore(time2)){ System.out.println(nowUtcTime+" is after: "+ time1+" and before: "+ time2); } } 

En el snipet de código a continuación, se verifica que si la hora actual (puede ser cualquiera) existe entre la hora de inicio y de finalización o no:

  Calendar startTimeCal = Calendar.getInstance(); startTimeCal.setTime(startTime); int startTimeHour = startTimeCal.get(Calendar.HOUR_OF_DAY); if (startTimeHour == 0){ startTimeHour = 24; } int startTimeMinutes = startTimeCal.get(Calendar.MINUTE); Calendar curTimeCal = Calendar.getInstance(); curTimeCal.setTime(currentTime); int curTimeHour = curTimeCal.get(Calendar.HOUR_OF_DAY); int curTimeMinutes = curTimeCal.get(Calendar.MINUTE); Calendar endTimeCal = Calendar.getInstance(); endTimeCal.setTime(endTime); int endTimeHour = endTimeCal.get(Calendar.HOUR_OF_DAY); if (endTimeHour == 0) { endTimeHour = 24; } int endTimeMinutes = endTimeCal.get(Calendar.MINUTE); if (((curTimeHour > startTimeHour) || (curTimeHour == startTimeHour && curTimeMinutes >= startTimeMinutes)) && ((curTimeHour < endTimeHour) || (curTimeHour == endTimeHour && curTimeMinutes <= endTimeHour))) { //time exists between start and end time } else { //time doesn't exist between start and end time } 

perdón por el código de sudo … estoy en un teléfono. 😉

 between = (time < string2 && time > string1); if (string1 > string2) between = !between; 

si son marcas de tiempo o cadenas esto funciona. simplemente cambie los nombres de las variables para que coincidan

Lógicamente, si haces lo siguiente siempre deberías estar bien si usamos el tiempo militar …

si la hora de inicio es mayor que la hora de finalización, agregue 24 a la hora de finalización, o use los tiempos como está

compare la hora actual entre el inicio y el final.

Como mucha gente notó, no es un problema de fecha, es un problema lógico. Supongamos que un día se divide en dos intervalos: uno se encuentra entre las 20:11:13 y las 14:49:00, mientras que el otro se encuentra entre las 14:49:00 y las 20:11:13 (a qué intervalo pertenecen los extremos; tú). Si desea verificar si se incluye un horario determinado en el horario 20: 11: 13/14: 49: 00, el que le interesa, simplemente verifique si está incluido en el otro, 14: 49: 00 / 20:11:13, que es mucho más fácil porque el orden natural de los números, y luego niega el resultado.

Esto está funcionando, pero necesita alguna mejora.

 long timeToSeconds(String time){ long ret=0; String[] ar = time.split("\\:"); for(int i=0;i < ar.length ; i++){ ret+= Long.valueOf(ar[i])* Math.pow(60,(2-i)); // (60^(2-i)); } return ret; } boolean isTimeBetween(String startTime, String endTime,String currentTime) { long lCurrentTime = timeToSeconds(currentTime); long lstartTime = timeToSeconds(startTime); long lEndTime = timeToSeconds(endTime); if(((lstartTime-lCurrentTime)*(lEndTime-lCurrentTime)*(lstartTime-lEndTime))>0){ return true; }else{ return false; } } 

Modifica tu código como este-

  public void getTimeSpans(){ boolean firstTime = false, secondTime = false; if(isTimeBetween("20:11:13" ,"14:49:00",time1) { firstTime = true; } if(isTimeBetween("20:11:13" ,"14:49:00",time2) { secondTime = true; } }