El tiempo de comparación es incorrecto al elegir 12:00

Estoy creando un sistema de reserva y no quiero permitir que los usuarios reserven con la hora de inicio 11:00 y la hora de finalización a las 09:00 (anterior) (estoy usando el reloj de 24 horas). Tengo dos cuadros combinados llenos de cadenas que actúan como hora de inicio y finalización (09: 00,10: 00,11: 00,12: 00,13: 00 ….)

Tengo este código:

String start = (String) startTime.getSelectedItem(); String end = (String) endTime.getSelectedItem(); try { if(new SimpleDateFormat("hh:mm").parse(start).before(new SimpleDateFormat("hh:mm").parse(end))){ System.out.println("test1");// future date - good }else{ System.out.println("fail2");// old date - bad } } catch (ParseException ex) { System.out.println("error"); } 

Esto funciona perfectamente, excepto cuando elijo la hora de inicio / finalización para que sea 12:00. Las salidas del progtwig son opuestas a lo que se supone que debe emitir y no estoy seguro de por qué.

Si selecciono la hora de inicio 14:00 y la hora de finalización 12:00, el progtwig generará fail2 (buen resultado),

Si selecciono la hora de inicio 09:00 y la hora de finalización 12:00, el progtwig generará fail2 (debería ser test1),

si selecciono la hora de inicio 12:00 y la hora de finalización 10:00, el progtwig dará como resultado test1 (debería ser fail2),

si selecciono la hora de inicio 12:00 y la hora de finalización 15:00, el progtwig dará como resultado la prueba 1 (buen resultado)

Este tipo de problema solo ocurre cuando elijo las 12:00.

 public static void checkTimes(String start, String end) { try { if (LocalTime.parse(start).isBefore(LocalTime.parse(end))) { System.out.println("test1");// future date - good } else { System.out.println("fail2");// old date - bad } } catch (DateTimeParseException dtpe) { System.out.println("error"); } } 

Vamos a intentarlo:

  checkTimes("14:00", "12:00"); checkTimes("09:00", "12:00"); checkTimes("12:00", "10:00"); checkTimes("12:00", "15:00"); 

Esto imprime:

 fail2 test1 fail2 test1 

Creo que esto concuerda con lo que pretendías. Tenga en cuenta que LocalTime analiza sus cadenas sin la necesidad de un formateador explícito. Además, si confía en que su cuadro combinado solo contiene cadenas de tiempo válidas, puede omitir el constructo trycatch dado que DateTimeParseException es una excepción no verificada.

Si startTime y endTime son JComboBox , creo que incluso puede llenarlos LocalTime objetos LocalTime . Entonces no necesita analizar cuando el usuario selecciona uno de cada uno. Su JComboBox llamará a LocalTime.toString() , que devolverá una cadena como 09:00 , que a su vez mostrará el cuadro combinado y le permitirá al usuario seleccionar.

  LocalTime[] times = { LocalTime.of(9, 0), LocalTime.of(10, 0), LocalTime.of(11, 0), LocalTime.of(12, 0), LocalTime.of(13, 0), LocalTime.of(14, 0) }; JComboBox combo = new JComboBox<>(times); 

Combo

Desplegado:

Combobox desplegado

Estoy usando LocalTime desde java.time , la moderna API de fecha y hora de Java. java.time lo general, java.time es mucho mejor para trabajar que las clases de fecha y hora antiguas y desactualizadas como SimpleDateFormat , Date y más.

Enlace: tutorial de Oracle: Fecha y hora explicando cómo usar java.time .

Deberías usar HH:mm .

hh varía 01-12 , mientras que HH oscila 1-23 .

Actualizar

Verifique el documento de SimpleDateFormat :

H: Hora en el día (0-23)

h: Hora en am / pm (1-12)

 String start = (String) startTime.getSelectedItem(); String end = (String) endTime.getSelectedItem(); SimpleDateFormat timer = new SimpleDateFormat("HH:mm"); try { Date startD = timer.parse(start); Date endD = timer.parse(end); if(startD.before(endD)){ System.out.println("test1");// future date - good }else{ System.out.println("fail2");// old date - bad } } catch (ParseException ex) { System.out.println("error"); } 

Cambiar mi código a esto solucionó este problema …