Der Zeitvergleich ist falsch, wenn 12:00 Uhr gewählt wird

Ich erstelle ein Buchungssystem, und ich möchte nicht zulassen, dass Benutzer mit Startzeit 11:00 und Endzeit 09:00 (Vergangenheit) buchen (ich verwende 24 Stunden). Ich habe zwei Kombinationsfelder mit Strings, die als Start- und Endzeit dienen (09: 00,10: 00,11: 00,12: 00,13: 00 ….)

Ich habe diesen Code:

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

Dies funktioniert perfekt, außer wenn ich die Start- / Endzeit auf 12:00 stelle. Programm-Ausgaben gegenüber von dem, was es ausgeben soll und ich bin mir nicht sicher warum.

Wenn ich die Startzeit 14:00 und die Endzeit 12:00 wähle, gibt das Programm fail2 (gute Ausgabe) aus,

Wenn ich die Startzeit 09:00 und die Endzeit 12:00 wähle, gibt das Programm fail2 aus (sollte test1 sein),

Wenn ich Startzeit 12:00 und Endzeit 10:00 wähle, gibt das Programm test1 aus (sollte fail2 sein),

Wenn ich Startzeit 12:00 und Endzeit 15:00 wähle, gibt das Programm test1 aus (gute Ausgabe)

Diese Art von Problem tritt nur auf, wenn ich 12:00 Uhr auswähle.

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

Lass es uns versuchen:

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

Dies druckt:

 fail2 test1 fail2 test1 

Ich glaube, das stimmt mit dem überein, was Sie beabsichtigt haben. Beachten Sie, dass LocalTime die LocalTime analysiert, ohne dass ein expliziter Formatierer erforderlich ist. Wenn Sie darüber hinaus darauf vertrauen, dass Ihre Combobox nur gültige DateTimeParseException enthält, können Sie das trycatch – Konstrukt DateTimeParseException da DateTimeParseException eine ungeprüfte Ausnahme ist.

Wenn startTime und endTime JComboBox , glaube ich, dass Sie sogar LocalTime Objekte in sie füllen können. Dann müssen Sie nicht analysieren, wenn der Benutzer jeweils einen auswählt. Ihre JComboBox ruft LocalTime.toString() , was eine Zeichenfolge wie 09:00 LocalTime.toString() , die wiederum das Kombinationsfeld anzeigt und den Benutzer auswählen lässt.

  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

Entfaltet:

Combobox entfaltet

Ich verwende LocalTime von java.time , der modernen Java-API für Datum und Uhrzeit. java.time ist im Allgemeinen viel netter als die alten und veralteten Datums- und SimpleDateFormat wie SimpleDateFormat , Date und mehr.

Link: Oracle-Tutorial: Datum Zeit zu erklären, wie man java.time .

Sie sollten HH:mm .

hh reicht 01-12 , während HH 1-23 reicht.

Aktualisieren

Überprüfen Sie das Dokument von SimpleDateFormat :

H: Stunde am Tag (0-23)

h: Stunde in 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"); } 

Das Ändern dieses Codes hat dieses Problem behoben.