java datetime simpledateformat

java - Comparando el tiempo es incorrecto al escoger 12:00



datetime simpledateformat (3)

Debe utilizar HH:mm .

hh rangos hh 01-12 , mientras que los rangos HH 1-23 .

Actualizar

Compruebe el doc de SimpleDateFormat :

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

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

Estoy creando un sistema de reserva y no quiero permitir que los usuarios reserven con la hora de inicio de las 11:00 y la hora de finalización de las 09:00 (pasada) (estoy usando las 24 horas del día). 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 codigo

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 a las 12:00. Programe salidas opuestas a lo que se supone que debe generar y no estoy seguro de por qué.

Si selecciono la hora de inicio a las 14:00 y la hora de finalización a las 12:00, el programa generará fail2 (buena salida),

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

si elijo la hora de inicio 12:00 y la hora de finalización 10:00, el programa generará prueba1 (debería ser fail2),

si selecciono la hora de inicio 12:00 y la hora de finalización 15:00, el programa generará prueba1 (salida buena)

Este tipo de problema solo ocurre cuando selecciono 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 está de acuerdo 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 la construcción try - catch ya que la excepción DateTimeParseException es una excepción sin marcar.

Si startTime y endTime son JComboBox , creo que incluso puedes rellenar objetos LocalTime en ellos. 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 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<LocalTime> combo = new JComboBox<>(times);

Desplegado:

Estoy usando LocalTime de java.time , la moderna API de fecha y hora de Java. java.time es generalmente mucho más agradable para trabajar que las clases de fecha y hora antiguas y obsoletas como SimpleDateFormat , Date y más.

Enlace: Tutorial de Oracle: Fecha y hora que explica cómo usar java.time .


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

Cambiando mi código a este solucionado este problema ...