Tl;dr
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean isBetween =
( ! today.isBefore( localDate1 ) ) // “not-before” is short for “is-equal-to or later-than”.
&&
today.isBefore( localDate3 ) ;
Oder, besser noch, wenn Sie die DreiZehn-Extra Bibliothek zu Ihrem Projekt hinzufügen.
LocalDateRange.of(
LocalDate.of( … ) ,
LocalDate.of( … )
).contains(
LocalDate.now()
)
Halboffener Ansatz, bei dem der Anfang inklusive während das Ende exklusiv .
Schlechte Wahl des Formats
Das ist übrigens ein schlechtes Format für die Textdarstellung eines Datums oder einer Zeitangabe. Wann immer möglich, halten Sie sich an den Standard ISO 8601 Formate. ISO 8601-Formate sind eindeutig, kulturübergreifend verständlich und maschinell leicht zu analysieren.
Für einen reinen Datumswert ist das Standardformat JJJJ-MM-TT. Beachten Sie, dass dieses Format den Vorteil hat, dass es chronologisch ist, wenn es alphabetisch sortiert wird.
LocalDate
En LocalDate
stellt einen reinen Datumswert ohne Uhrzeit und ohne Zeitzone dar.
Die Zeitzone ist für die Bestimmung eines Datums entscheidend. Zu jedem beliebigen Zeitpunkt variiert das Datum je nach Zone rund um den Globus. Zum Beispiel, ein paar Minuten nach Mitternacht in Paris Frankreich ist ein neuer Tag und dennoch "gestern" in Montréal Québec .
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Da es sich bei Ihren Eingabestrings um ein Nicht-Standardformat handelt, müssen wir ein Formatierungsmuster für die Übereinstimmung definieren.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
Verwenden Sie dies, um die Eingabestrings zu parsen.
LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );
Bei der Arbeit mit Datums- und Zeitangaben ist es in der Regel am besten, eine Zeitspanne nach dem halboffenen Ansatz zu definieren, bei dem der Beginn inklusive und das Ende ist exklusiv . Wir wollen also wissen, ob der heutige Tag gleich oder später als der Start und auch vor dem Stopp liegt. Eine kürzere Art zu sagen "ist gleich oder später als der Start" ist "nicht vor dem Start".
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;
Véase die Antwort von gstackoverflow mit der Liste der Vergleichsmethoden, die Sie aufrufen können.
Über java.time
En java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Weitere Informationen finden Sie in der Oracle-Tutorial . Und suchen Sie auf Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 310 .
En ジョダイム Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.
Sie können umtauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber übereinstimmend mit JDBC 4.2 oder später. Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.*
Klassen. Unterstützung von Hibernate 5 und JPA 2.2 java.time .
Wo erhält man die java.time-Klassen?
En DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval
, YearWeek
, YearQuarter
und mehr .
UPDATE: Dieser "Joda-Time"-Abschnitt unten wird als Geschichte beibehalten. Die ジョダイム Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.
ジョダイム
Andere Antworten sind richtig in Bezug auf die gebündelten Klassen java.util.Date und java.util.Calendar. Aber diese Klassen sind notorisch problematisch. Hier ist also ein Beispielcode, der die ジョダイム 2.3 Bibliothek.
Wenn Sie wirklich ein Datum ohne Zeitanteil und ohne Zeitzone wollen, dann verwenden Sie die LocalDate
Klasse in Joda-Time. Diese Klasse bietet Vergleichsmethoden wie compareTo
(verwendet mit Java-Vergleicher ), isBefore
, isAfter
und isEqual
.
Eingänge
String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";
Definieren Sie einen Formatierer, der die Eingabezeichenfolgen beschreibt
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
Verwenden Sie den Formatierer, um die Strings in LocalDate-Objekte zu parsen
LocalDate localDate1 = formatter.parseLocalDate( string1 );
LocalDate localDate2 = formatter.parseLocalDate( string2 );
LocalDate localDate3 = formatter.parseLocalDate( string3 );
boolean is1After2 = localDate1.isAfter( localDate2 );
boolean is2Before3 = localDate2.isBefore( localDate3 );
Dump zur Konsole
System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );
Wenn es läuft
Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true
Schauen Sie also, ob der zweite zwischen den beiden anderen liegt (ausschließlich, d.h. nicht gleich einem der beiden Endpunkte)
boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );
Arbeiten mit Zeitspannen
Wenn Sie mit Zeitspannen arbeiten, schlage ich vor, in Joda-Time die Klassen zu erkunden: Dauer , Intervall und Zeitraum . Methoden wie overlap
y contains
machen Vergleiche einfach.
Für die Darstellung von Text können Sie sich an der ISO-Norm 8601 orientieren:
- Dauer
Format: PnYnMnDTnHnMnS
Beispiel: P3Y6M4DT12H30M5S
(Bedeutet "drei Jahre, sechs Monate, vier Tage, zwölf Stunden, dreißig Minuten und fünf Sekunden")
- Intervall
Format: Anfang/Ende
Example: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z
Joda-Time-Klassen können mit Strings in diesen beiden Formaten arbeiten, sowohl als Eingabe (Parsing) als auch als Ausgabe (Generierung von Strings).
Joda-Time führt Vergleiche unter Verwendung der Halboffen Ansatz, bei dem der Beginn der Spannweite inklusive und das Ende ist exklusiv . Dieser Ansatz ist ein kluger Ansatz für die Handhabung von Zeitspannen. Weitere Informationen finden Sie auf StackOverflow.