Datum ohne Uhrzeit in Java abrufen

1. Einleitung

In diesem kurzen Tutorial zeigen wir, wie Sie in Java ein Datum ohne Zeit erhalten.

Wir werden zeigen, wie dies vor und nach Java 8 gemacht wird, da die Dinge nach der Veröffentlichung der neuen Zeit-API in Java 8 etwas anders geworden sind.

2. Vor Java 8

Vor Java 8 gab es keinen direkten Weg, um ein Datum ohne Zeit zu erhalten, es sei denn, wir verwendeten Bibliotheken von Drittanbietern wie Joda-time.

Dies liegt daran, dass die Date- Klasse in Java eine Darstellung eines bestimmten Zeitpunkts in Millisekunden ist . Daher ist es unmöglich, die Uhrzeit eines Datums zu ignorieren .

In den nächsten Abschnitten werden einige allgemeine Problemumgehungen zur Behebung dieses Problems aufgeführt.

2.1. Mit Kalender

Eine der häufigsten Möglichkeiten, ein Datum ohne Zeit zu erhalten, besteht darin , die Zeit mithilfe der Kalenderklasse auf Null zu setzen . Auf diese Weise erhalten wir ein sauberes Datum, wobei die Uhrzeit zu Beginn des Tages festgelegt wird.

Lassen Sie es uns im Code sehen:

public static Date getDateWithoutTimeUsingCalendar() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); }

Wenn wir diese Methode aufrufen, erhalten wir ein Datum wie das folgende:

Sat Jun 23 00:00:00 CEST 2018

Wie wir sehen können, wird ein vollständiges Datum mit der auf Null gesetzten Zeit zurückgegeben, aber wir können die Zeit nicht ignorieren .

Um sicherzustellen, dass im zurückgegebenen Datum keine Zeit festgelegt ist , können wir den folgenden Test erstellen:

@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() { Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar(); Calendar calendar = Calendar.getInstance(); calendar.setTime(dateWithoutTime); int day = calendar.get(Calendar.DAY_OF_MONTH); calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY - 1); assertEquals(day, calendar.get(Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY); assertNotEquals(day, calendar.get(Calendar.DAY_OF_MONTH)); }

Wie wir sehen können, erhalten wir, wenn wir die Millisekunden eines Tages minus eins zum Datum hinzufügen, immer noch denselben Tag, aber wenn wir einen ganzen Tag hinzufügen, erhalten wir den nächsten Tag.

2.2. Formatierer verwenden

Eine andere Möglichkeit, dies zu tun, besteht darin, ein Datum ohne Uhrzeit in einen String zu formatieren und diesen String dann wieder in ein Datum umzuwandeln . Da der String ohne die Uhrzeit formatiert wurde, wird für das konvertierte Datum die Uhrzeit auf Null gesetzt.

Lassen Sie es uns implementieren, um zu sehen, wie es funktioniert:

public static Date getDateWithoutTimeUsingFormat() throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat( "dd/MM/yyyy"); return formatter.parse(formatter.format(new Date())); }

Diese Implementierung gibt dieselbe zurück wie die im vorherigen Abschnitt gezeigte Methode:

Sat Jun 23 00:00:00 CEST 2018

Auch hier können wir einen Test wie zuvor verwenden, um sicherzustellen, dass das zurückgegebene Datum keine Zeit enthält .

3. Verwenden von Java 8

Mit der Veröffentlichung der neuen Zeit-API in Java 8 gibt es eine einfachere Möglichkeit, ein Datum ohne Uhrzeit abzurufen. Eine der neuen Funktionen, die diese neue API mit sich gebracht hat, ist, dass es mehrere Klassen gibt, die mit Datumsangaben mit oder ohne Zeit oder sogar nur mit Zeit arbeiten können.

In diesem Artikel konzentrieren wir uns auf die Klasse LocalDate , die genau das darstellt, was wir brauchen, ein Datum ohne Uhrzeit.

Lassen Sie es uns anhand dieses Beispiels sehen:

public static LocalDate getLocalDate() { return LocalDate.now(); }

Diese Methode gibt ein LocalDate- Objekt mit dieser Datumsdarstellung zurück :

2018-06-23

Wie wir sehen können, gibt es nur ein Datum zurück, die Uhrzeit wird vollständig ignoriert .

Testen wir es erneut wie zuvor, um sicherzustellen, dass diese Methode wie erwartet funktioniert:

@Test public void whenGettingLocalDate_thenReturnDateWithoutTime() { LocalDate localDate = DateWithoutTime.getLocalDate(); long millisLocalDate = localDate .atStartOfDay() .toInstant(OffsetDateTime .now() .getOffset()) .toEpochMilli(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis( millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals( localDate.getDayOfMonth(), calendar.get(Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis(millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals( localDate.getDayOfMonth(), calendar.get(Calendar.DAY_OF_MONTH)); }

4. Fazit

In diesem Artikel haben wir gezeigt, wie Sie in Java ein Datum ohne Zeit erhalten. Wir haben zuerst gezeigt, wie es vor Java 8 und auch mit Java 8 gemacht wird.

Wie wir in den im Artikel implementierten Beispielen sehen konnten, sollte die Verwendung von Java 8 immer die bevorzugte Option sein , da es eine spezifische Darstellung hat, um mit Datumsangaben ohne Zeit zu arbeiten.

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