Wie vergleicht man Daten in Java?
Wie vergleiche ich Datumsangaben in Java miteinander?
Beispiel:
Datum1 ist 22-02-2010
datum2 ist 07-04-2010
heute
datum3 ist 25-12-2010
Datum3
ist immer größer als Datum1
und Datum2
ist immer heute.
Wie überprüfe ich, ob das Datum von heute' zwischen Datum1 und Datum 3 liegt?
367
11
[Datum][1] hat [vor][2] und [nach][3] Methoden und kann [miteinander][4] wie folgt verglichen werden:
Für einen umfassenden Vergleich:
Verwenden Sie [compareTo][1]:
date1.compareTo(datum2);
[1]: https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#compareTo-java.util.Date-
Im Folgenden sind die gebräuchlichsten Methoden zum Vergleich von Daten aufgeführt. Aber ich habe die erste bevorzugt
Ansatz-1 : Verwendung von Date.before(), Date.after() und Date.equals()
Ansatz-2 : Datum.vergleichenZu()
~ tl;dr ~
Oder, besser, wenn Sie die Drei-Zehn-Extra-Bibliothek zu Ihrem Projekt hinzufügen.
Halboffener Ansatz, bei dem der Anfang inklusiv ist, während das Ende exklusiv ist.
Schlechte Wahl des Formats
Das ist übrigens eine schlechte Wahl des Formats für eine Textdarstellung eines Datums- oder Datum-Uhrzeit-Wertes. Halten Sie sich, wann immer möglich, an die Standardformate [ISO 8601][1]. Die ISO 8601-Formate sind eindeutig, in allen menschlichen Kulturen verständlich und maschinell leicht zu analysieren. Für einen reinen Datumswert lautet das Standardformat JJJJJ-MM-TT. Beachten Sie, dass dieses Format den Vorteil hat, bei alphabetischer Sortierung chronologisch zu sein.
LocalDate
Die Klasse
LocalDate
stellt einen reinen Datumswert ohne Tageszeit und ohne Zeitzone dar. Eine Zeitzone ist für die Bestimmung eines Datums von entscheidender Bedeutung. Zu jedem beliebigen Zeitpunkt variiert das Datum auf dem Globus je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während er in Montréal Québec noch "gestern" ist.DateTimeFormatter
Da Ihre Eingabezeichenfolgen kein Standardformat haben, müssen wir ein entsprechendes Formatierungsmuster definieren.
Verwenden Sie dies, um die Eingabezeichenfolgen zu analysieren.
In der Datumszeitarbeit ist es normalerweise am besten, eine Zeitspanne durch den Half-Open-Ansatz zu definieren, bei dem der Anfang inklusiv ist, während das Ende exklusiv ist. Wir wollen also wissen, ob heute derselbe Tag ist oder später als der Start und auch vor dem Stopp. Ein kürzerer Weg zu sagen "ist gleich oder später als der Start" ist "nicht vor dem Start".
Siehe [the Answer by gstackoverflow] (https://stackoverflow.com/a/33693122/642706) mit der Liste der Vergleichsmethoden, die Sie aufrufen können.
Über java.time
Das java.time Framework ist in Java 8 und höher eingebaut. Diese Klassen ersetzen die lästigen alten legacy Datum-Uhrzeit-Klassen wie
java.util.Date
,Calendar
, &EinfachesDatumsformat
. Das Joda-Time-Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration auf die java.time-Klassen. Weitere Informationen finden Sie im Oracle Tutorial. Und suchen Sie Stack Overflow für viele Beispiele und Erklärungen. Die Spezifikation lautet JSR 310. Wo erhält man die java.time Klassen?Siehe So verwenden Sie ThreeTenABP.... Das ThreeTen-Extra Projekt erweitert java.time mit zusätzlichen Klassen. Dieses Projekt ist ein Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie können hier einige nützliche Klassen finden, wie z.B.
Interval
,YearWeek
,YearQuarter
und more.AKTUALISIEREN: Dieser "Joda-Time"-Abschnitt unten ist als Geschichte intakt geblieben. Das Joda-Time-Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration zu den java.time-Klassen. Joda-Zeit
Andere Antworten sind korrekt in Bezug auf die gebündelten Klassen java.util.Date und java.util.Calendar. Aber diese Klassen sind notorisch lästig. Daher hier's etwas Beispielcode unter Verwendung der Bibliothek [Joda-Time][2] 2.3.
Wenn Sie wirklich ein Datum ohne Zeitanteil und ohne Zeitzone wünschen, dann verwenden Sie die Klasse [
LocalDate
][3] in Joda-Time. Diese Klasse stellt Vergleichsmethoden zur Verfügung, einschließlichcompareTo
(verwendet mit [Java Comparators][4]),isBefore
,isAfter
undisEqual
. Eingaben...Definieren Sie einen Formatierer, der die Eingabestrings beschreibt...
Verwenden Sie Formatierer, um die Zeichenfolgen in LocalDate-Objekte zu parsen...
Dump auf die Konsole...
Wenn ausgeführt...
Schauen Sie also, ob der zweite zwischen den beiden anderen liegt (ausschließlich, d.h. nicht gleich einem der beiden Endpunkte)...
Arbeiten mit Zeitspannen
Wenn Sie mit Zeitspannen arbeiten, schlage ich vor, die Klassen in Joda-Time zu erforschen: [Dauer][5], [Intervall][6] und [Periode][7]. Methoden wie "Überlappung" und "Enthält" machen Vergleiche leicht. Für Textdarstellungen sehen Sie sich die ISO 8601-Normen an:
Format: PnYnMnDTnHnMnMnS
Beispiel: [Dauer][8]
Beispiel: P3Y6M4DT12H30M5S
(Bedeutet "drei Jahre, sechs Monate, vier Tage, zwölf Stunden, dreißig Minuten und fünf Sekunden")
Format: Anfang/Ende
Beispiel: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z Joda-Time-Klassen können mit Zeichenketten in diesen beiden Formaten arbeiten, sowohl als Eingabe (Parsen) als auch als Ausgabe (Erzeugen von Zeichenketten). Joda-Time führt Vergleiche mit dem Half-Open-Ansatz durch, bei dem der Anfang der Spanne inklusiv ist, während das Ende exklusiv ist. Dieser Ansatz ist ein kluger Ansatz für die Behandlung von Zeitspannen. Suchen Sie StackOverflow für weitere Informationen. [1]: http://en.wikipedia.org/wiki/ISO_8601 [2]: http://www.joda.org/joda-time/ [3]: http://www.joda.org/joda-time/apidocs/org/joda/time/LocalDate.html [4]: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html [5]: http://www.joda.org/joda-time/apidocs/org/joda/time/Duration.html [6]: http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html [7]: http://www.joda.org/joda-time/apidocs/org/joda/time/Period.html [8]: http://en.wikipedia.org/wiki/ISO_8601#Durations [9]: http://en.wikipedia.org/wiki/ISO_8601#Time_intervals
Vergleichen Sie die beiden Daten:
Update für Java 8 und höher
ist nach()
vor()
isEqual()
Vergleich zu()
](http://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#compareTo-java.time.chrono.ChronoLocalDate-)Diese Methoden existieren in den Klassen [
LocalDate
][1], [LocalTime
][2] und [LocalDateTime
][3].Diese Klassen sind in Java 8 und höher eingebaut. Ein Großteil der Funktionalität von java.time wird nach Java 6 & zurückportiert; 7 in ThreeTen-Backport zurückportiert und weiter an Android in ThreeTenABP angepasst (siehe How to use...).
[1]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html [2]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html [3]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html
Sie können [
Date.getTime()
][1] verwenden:Das bedeutet, dass Sie sie wie Zahlen vergleichen können:
Verwenden Sie getTime(), um den numerischen Wert des Datums zu erhalten, und vergleichen Sie dann mit den zurückgegebenen Werten.
Versuchen Sie dies
Diese Methode hat bei mir funktioniert:
Dieser Code bestimmt heute ist in einiger Dauer. basierend auf KOREA-Gebietsschema