Überprüfen, ob zwei Java-Daten am selben Tag liegen

1. Übersicht

In diesem kurzen Tutorial lernen wir verschiedene Möglichkeiten kennen, um zu überprüfen, ob zwei java.util.Date- Objekte denselben Tag haben .

Wir werden zunächst Lösungen mit Java-Kernfunktionen - nämlich Java 8-Funktionen - in Betracht ziehen, bevor wir uns einige Alternativen vor Java 8 ansehen.

Zum Abschluss werden wir uns auch einige externe Bibliotheken ansehen - Apache Commons Lang, Joda-Time und Date4J .

2. Core Java

Die Klasse Datum repräsentiert einen bestimmten Zeitpunkt mit einer Genauigkeit von Millisekunden . Um herauszufinden, ob zwei Datumsobjekte denselben Tag enthalten, müssen wir überprüfen, ob das Jahr-Monat-Tag für beide Objekte gleich ist, und den Zeitaspekt verwerfen .

2.1. Verwenden von LocalDate

Mit der neuen Datums- / Uhrzeit-API von Java 8 können wir das LocalDate- Objekt verwenden. Dies ist ein unveränderliches Objekt, das ein Datum ohne Uhrzeit darstellt.

Mal sehen, wie wir mit dieser Klasse überprüfen können, ob zwei Datumsobjekte denselben Tag haben:

public static boolean isSameDay(Date date1, Date date2) { LocalDate localDate1 = date1.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); LocalDate localDate2 = date2.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); return localDate1.isEqual(localDate2); }

In diesem Beispiel haben wir beide Date- Objekte mit der Standardzeitzone in LocalDate konvertiert . Nach der Konvertierung müssen wir nur mit der isEqual- Methode überprüfen, ob die LocalDate- Objekte gleich sind .

Mit diesem Ansatz können wir daher feststellen, ob die beiden Datumsobjekte denselben Tag enthalten.

2.2. Mit Sofort

Im obigen Beispiel haben wir Instant als Zwischenobjekt beim Konvertieren von Date- Objekten in LocalDate- Objekte verwendet. Instant , eingeführt in Java 8, repräsentiert einen bestimmten Zeitpunkt .

Wir können die Instant- Objekte direkt auf die DAYS-Einheit kürzen , die die Zeitfeldwerte auf Null setzt, und sie dann vergleichen:

public static boolean isSameDayUsingInstant(Date date1, Date date2) { Instant instant1 = date1.toInstant() .truncatedTo(ChronoUnit.DAYS); Instant instant2 = date2.toInstant() .truncatedTo(ChronoUnit.DAYS); return instant1.equals(instant2); }

2.3. Verwenden von SimpleDateFormat

Seit frühen Versionen von Java, haben wir in der Lage, die verwenden Simple Klasse zwischen konvertiert Datum und String Objektdarstellungen. Diese Klasse bietet Unterstützung für die Konvertierung mit vielen Mustern. In unserem Fall verwenden wir das Muster "yyyyMMdd" .

Auf diese Weise formatieren wir das Datum, konvertieren es in ein String- Objekt und vergleichen sie dann mit der Standardmethode equals :

public static boolean isSameDay(Date date1, Date date2) { SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); return fmt.format(date1).equals(fmt.format(date2)); }

2.4. Mit Kalender

Die Calendar- Klasse bietet Methoden zum Abrufen der Werte verschiedener Datums- und Zeiteinheiten für einen bestimmten Zeitpunkt.

Zunächst müssen wir eine Kalenderinstanz erstellen und die Uhrzeit der Kalenderobjekte anhand der angegebenen Daten festlegen . Anschließend können wir die Attribute Jahr-Monat-Tag einzeln abfragen und vergleichen, um herauszufinden, ob die Datumsobjekte denselben Tag haben:

public static boolean isSameDay(Date date1, Date date2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(date2); return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH); }

3. Externe Bibliotheken

Nachdem wir nun ein gutes Verständnis für den Vergleich von Datumsobjekten mit den neuen und alten APIs von Core Java haben, werfen wir einen Blick auf einige externe Bibliotheken.

3.1. Apache Commons Lang DateUtils

Die DateUtils Klasse bietet viele nützliche Dienstprogramme , die es einfacher für die Arbeit mit dem Erbe machen Kalender und Datum der Objekte .

Das Apache Commons Lang-Artefakt ist bei Maven Central erhältlich:

 org.apache.commons commons-lang3 3.9 

Dann können wir einfach die Methode isSameDay von DateUtils verwenden :

DateUtils.isSameDay(date1, date2);

3.2. Joda-Zeitbibliothek

Eine Alternative zur Java- Kernbibliothek für Datum und Uhrzeit ist Joda-Time. Diese weit verbreitete Bibliothek ist ein hervorragender Ersatz für die Arbeit mit Datum und Uhrzeit .

Das Artefakt befindet sich in Maven Central:

 joda-time joda-time 2.10 

In this library, org.joda.time.LocalDate represents a date without time. Hence, we can construct the LocalDate objects from the java.util.Date objects and then compare them:

public static boolean isSameDay(Date date1, Date date2) { org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1); org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2); return localDate1.equals(localDate2); }

3.3. Date4J Library

Date4j also provides a straightforward and simple implementation that we can use.

Likewise, it is also available from Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

Using this library, we need to construct the DateTime object from a java.util.Date object. Then we can simply use the isSameDayAs method:

public static boolean isSameDay(Date date1, Date date2) { DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault()); DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault()); return dateObject1.isSameDayAs(dateObject2); }

4. Conclusion

In this quick tutorial, we've explored several ways of checking if two java.util.Date objects contain the same day.

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.