Vergleichen von Datumszeichenfolgen in Java [duplizieren]

7

Also benutze ich dateString1.compareTo(dateString2) , das einen lexikographischen Vergleich mit Strings durchführt, basierend auf dem Unicode-Wert jedes Zeichens, und gibt einen int zurück. Hier ist ein Codebeispiel.

%Vor%

Ist das ein falscher Ansatz, um Daten in Java zu vergleichen?

Bei meinen Tests bin ich nicht in eine Situation geraten, in der ich ein unerwartetes Ergebnis erhalten habe. Ich möchte wirklich kein Date-Objekt aus der Zeichenfolge erstellen, wenn ich das nicht tun muss, weil ich dies in einer langen laufenden Schleife mache.

Ninja Bearbeiten Von den folgenden Antworten abgesehen, ist nichts falsch daran, Datumsangaben als Zeichenfolge zu vergleichen, wenn sie in yyyyMMdd -Format vorliegt, aber wenn sie in einem anderen Format vorliegt, wird dies offensichtlich zu einem Fehler führen.

Ich habe tatsächlich meine Datumszeichenfolge als yyyyMMdd Format in meinem tatsächlichen Code. (Ich tippte das Format falsch in das Beispiel, das ich oben angegeben hatte.) Für den Augenblick lasse ich den Code einfach so, wie er ist, und füge einige Zeilen Kommentare hinzu, um meine Entscheidung zu rechtfertigen.

Aber ich sehe jetzt, dass der Vergleich solcher Strings sehr einschränkend ist und ich werde auf Fehler stoßen, wenn dba beschließt, das Datumsformat auf der Straße zu ändern, was ich nicht sehe.

    
pacman 15.05.2012, 22:18
quelle

6 Antworten

8

Ich schlage vor, dass Sie das Richtige tun ( wie hier beschrieben ) und in den richtigen Prozentsatz konvertieren. co_de% zu vergleichende Objekte. Machen Sie sich Sorgen über die Auswirkungen auf die Leistung, wenn sie Ihre Anwendung tatsächlich beeinflussen (was wahrscheinlich nicht der Fall ist).

    
andersoj 15.05.2012, 22:23
quelle
17

Verwenden Sie Strings, um Daten in Java zu verarbeiten, ist nicht immer die beste Option. Zum Beispiel, wenn es ein Sprung Jahr ist, hat der Februar einen zusätzlichen Tag. Da Zeichenfolgen scheinbar korrekt sind, ist es sinnvoller, eine -Konvertierung durchzuführen. Java bestätigt, dass das Datum korrekt ist.

Sie können Strings in Datumsangaben konvertieren, indem Sie die Klasse SimpleDateFormat verwenden.

%Vor%

Um herauszufinden, welche Parameter überprüft werden dürfen Customizing-Formate (Die Java ™ -Tutorials & gt; Internationalisierung & gt; Formatierung)

    
Paul Vargas 15.05.2012 22:34
quelle
4

Es ist ziemlich schlecht, da Sie jetzt nicht mehr mit einem Jahreswechsel fertig werden können.

Wenn Sie so wollen, möchten Sie vielleicht das Datum als YYYY-MM-DD formatieren, damit das neue Jahr es nicht ruiniert.

    
ratchet freak 15.05.2012 22:20
quelle
2

Es ist schlecht, die Regeln für die Alphabetisierung zu verwenden, um die Datumsreihenfolge zu handhaben, vor allem, weil Sie auf Probleme stoßen, bei denen die Dinge je nach Alphabet und Zahlensystem anders angeordnet sind

Für das Alphabet

%Vor%

Für das Nummernsystem

%Vor%

Datumsobjekte erweitern den numerischen Vergleich, um zu ermitteln, welche Felder im Vergleich Vorrang haben. Sie erhalten also keinen früheren Monat, in dem ein Datum vor dem anderen in einem späteren Monat, sondern in einem früheren Jahr liegt.

Wenn Sie das Datumsformat streng kontrollieren, können Sie die Daten so ausrichten, dass sie auch alphabetischen Regeln folgen. Dies birgt jedoch das Risiko, dass Ihr gesamtes Programm auf seltsame Weise versagt, wenn Sie versehentlich ein falsch formatiertes Datum injizieren.

Der typische Weg dazu ist (nicht empfohlen, bitte verwenden Sie Nicht-String-Datumsvergleiche)

%Vor%

Die letzte Technik ist hauptsächlich enthalten, da Sie sie schließlich in freier Wildbahn sehen werden und sie für das, was sie ist, erkennen sollten: ein Versuch, Daten ohne eine richtige Datumsbibliothek (aka ein cleverer Hack) zu behandeln.

    
Edwin Buck 17.05.2012 15:14
quelle
1

Wenn Sie nur einen Lesevorgang für jedes Datum ausführen, ist YYYYMMDD (nicht MMDDYYYY, wie Sie es getan haben) die optimale Lösung. Wenn Sie jedoch beabsichtigen, jedes Datum mehrmals zu verarbeiten (z. B. wenn Sie sie sortieren), ist es besser, sie in ein Objekt zu ändern, das schneller verglichen werden kann als ein String (z. B. Datum).

    
piotrek 15.05.2012 23:44
quelle
1

Wie besprochen, ist es im Allgemeinen besser, mit Datum-Zeit-Objekten als Strings zu arbeiten.

java.time

Die anderen Antworten verwenden alte veraltete Datum-Uhrzeit-Klassen, die sich als schlecht entworfen, verwirrend und mühsam erwiesen haben. Ihnen fehlt eine Klasse, um einen reinen Datumswert ohne Uhrzeit und ohne Zeitzone darzustellen.

Verwenden Sie stattdessen das integrierte java.time -Rahmenwerk Java 8 und später. Siehe Oracle-Lernprogramm . Ein Großteil der java.time-Funktionalität wird auf Java 6 & amp; 7 in ThreeTen-Backport und weiter angepasst an Android in ThreeTenABP .

%Vor%

Das LocalDate implementiert compareTo . Außerdem können Sie Methoden gleich, isBefore, isAfter aufrufen.

%Vor%     
Basil Bourque 12.07.2016 16:59
quelle

Tags und Links