Datum ohne Uhrzeit in Java abrufen

Datum ohne Zeit in Java abrufen

1. Einführung

In diesem kurzen Tutorial zeigen wir, wie Sie in Java einDate 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, umDate ohne Zeit zu erhalten, es sei denn, wir verwendeten Bibliotheken von Drittanbietern wie Joda-time.

Dies liegt daran, dassthe Date class in Java is a representation of a specific instant in time, expressed in milliseconds. Daher ist es unmöglich, die Zeit auf aDate zu ignorieren.

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

2.1. Verwenden vonCalendar

Eine der häufigsten Methoden, umDate ohne Zeit zu erhalten, istuse the Calendar class to set the time to zero. Auf diese Weise erhalten wir ein sauberes Datum mit der Uhrzeit, die zu Beginn des Tages festgelegt wurde.

Sehen wir es uns im Code an:

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 zurückgegeben, wobei die Zeit auf Null gesetzt ist, jedochwe can’t ignore the time.

Um sicherzustellen, dass in den zurückgegebenenDate 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 addieren, immer noch denselben Tag, aber wenn wir einen ganzen Tag addieren, erhalten wir den nächsten Tag.

2.2. Formatierer verwenden

Eine andere Möglichkeit, dies zu tun, istformatting a Date into a String without the time and then convert that String back to a Date. DaString ohne die Zeit formatiert wurde, wird für die konvertiertenDate die Zeit auf Null gesetzt.

Implementieren wir es, 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 Methode zurück wie die im vorherigen Abschnitt gezeigte:

Sat Jun 23 00:00:00 CEST 2018

Auch hier können wir einen Test wie zuvor verwenden, um sicherzustellen, dass die zurückgegebenenDatekeine Zeit haben.

3. Java verwenden 8

Mit der Veröffentlichung der neuen Uhrzeit-API in Java 8 ist es einfacher, ein Datum ohne Uhrzeit zu ermitteln. Eine der neuen Funktionen dieser neuen API ist, dass es mehrere Klassen gibt, die mit Datumsangaben mit oder ohne Zeit oder sogar nur mit Zeitangaben arbeiten können.

In diesem Artikel konzentrieren wir uns auf die KlasseLocalDate, die genau das darstellt, was wir benötigen, ein Datum ohne Uhrzeit.

Sehen wir uns das anhand dieses Beispiels an:

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

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

2018-06-23

Wie wir sehen können, gibt es nur ein Datum zurück,the time is completely ignored.

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 einDate ohne Zeit erhalten. Wir haben zuerst gezeigt, wie es vor Java 8 und auch unter Verwendung von Java 8 gemacht wird.

Wie wir in den im Artikel implementierten Beispielen mitJava 8 should be always the preferred option sehen konnten, hat es eine spezifische Darstellung, um mit Datumsangaben ohne Zeit zu arbeiten.

Wie immer ist der vollständige Quellcode der Beispieleover on GitHub verfügbar.