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.
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.
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).
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)
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.
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.
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).
Wie besprochen, ist es im Allgemeinen besser, mit Datum-Zeit-Objekten als Strings zu arbeiten.
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.