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 ...