Hinzufügen von Stunden zu einem Datum in Java

Hinzufügen von Stunden zu einem Datum in Java

1. Überblick

Vor Java 8 warjava.util.Date eine der am häufigsten verwendeten Klassen zur Darstellung von Datums- und Zeitwerten in Java.

Dann führte Java 8java.time.LocalDateTime undjava.time.ZonedDateTime. ein. Java 8 ermöglicht es uns auch, eine bestimmte Zeit auf der Zeitachse mitjava.time.Instant. darzustellen

In diesem Tutorial lernen wiradd or subtract n hours from a given date-time in Java. Wir werden uns zunächst einige Standardklassen für Java-Datums- und Uhrzeitangaben ansehen und dann einige Optionen von Drittanbietern vorstellen.

Um mehr über die Java 8 DateTime-API zu erfahren, empfehlen wir,this article zu lesen.

2. java.util.Date

Wenn wir Java 7 oder niedriger verwenden, können wir die Klassenjava.util.Date undjava.util.Calendar für die meisten datums- und zeitbezogenen Behandlungen verwenden.

Lassen Sie uns sehen, wie Sie einem bestimmtenDate-Objektntunden hinzufügen:

public Date addHoursToJavaUtilDate(Date date, int hours) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, hours);
    return calendar.getTime();
}

Beachten Sie, dassCalendar.HOUR_OF_DAY is referring to a 24-hour clock.

Die obige Methode gibt ein neuesDate-Objekt zurück, dessen Wert entweder(date + hours) oder(date – hours) wäre, je nachdem, ob wir einen positiven oder einen negativen Wert vonhours übergeben.

Angenommen, wir haben eine Java 8-Anwendung, möchten aber dennoch mitjava.util.Date-Instanzen arbeiten.

In einem solchen Fall können wir uns für den folgenden alternativen Ansatz entscheiden:

  1. Verwenden Sie die Methodejava.util.DatetoInstant(), um einDate-Objekt in einejava.time.Instant-Instanz zu konvertieren

  2. Fügen Sie demjava.time.Instant-Objekt mithilfe derplus()-Methode ein bestimmtesDuration hinzu

  3. Stellen Sie die Instanz vonjava.util.Datewieder her, indem Sie das Objekt vonjava.time.Instantan die Methode vonjava.util.Date.from()übergeben

Werfen wir einen kurzen Blick auf diesen Ansatz:

@Test
public void givenJavaUtilDate_whenUsingToInstant_thenAddHours() {
    Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0)
      .getTime();
    Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0)
      .getTime();

    assertThat(Date.from(actualDate.toInstant().plus(Duration.ofHours(2))))
      .isEqualTo(expectedDate);
}

Beachten Sie jedoch, dassit’s always recommended to use the new DateTime API for all applications on Java 8 or higher versions.

3. java.time.LocalDateTime/ZonedDateTime

In Java 8 oder höher ist das Hinzufügen von Stunden zu einerjava.time.LocalDateTime or java.time.ZonedDateTime-Instanz ziemlich einfach und verwendet dieplusHours()-Methode:

@Test
public void givenLocalDateTime_whenUsingPlusHours_thenAddHours() {
    LocalDateTime actualDateTime = LocalDateTime
      .of(2018, Month.JUNE, 25, 5, 0);
    LocalDateTime expectedDateTime = LocalDateTime.
      of(2018, Month.JUNE, 25, 10, 0);

    assertThat(actualDateTime.plusHours(5)).isEqualTo(expectedDateTime);
}

Was ist, wenn wir ein paar Stunden abziehen möchten?

Das Übergeben eines negativen Stundenwerts an die MethodeplusHours()reicht völlig aus. Es wird jedoch empfohlen, dieminusHours()-Methode zu verwenden:

@Test
public void givenLocalDateTime_whenUsingMinusHours_thenSubtractHours() {
    LocalDateTime actualDateTime = LocalDateTime
      .of(2018, Month.JUNE, 25, 5, 0);
    LocalDateTime expectedDateTime = LocalDateTime
      .of(2018, Month.JUNE, 25, 3, 0);

    assertThat(actualDateTime.minusHours(2)).isEqualTo(expectedDateTime);

}

Die MethodenplusHours() undminusHours() injava.time.ZonedDateTime funktionieren genauso.

4. java.time.Instant

Wie wir wissen, repräsentiertjava.time.Instant, das in der Java 8 DateTime-API eingeführt wurde, einen bestimmten Moment auf der Zeitachse.

Um einemInstant-Objekt einige Stunden hinzuzufügen, können wir seineplus()-Methode mit einemjava.time.temporal.TemporalAmount verwenden:

@Test
public void givenInstant_whenUsingAddHoursToInstant_thenAddHours() {
    Instant actualValue = Instant.parse("2018-06-25T05:12:35Z");
    Instant expectedValue = Instant.parse("2018-06-25T07:12:35Z");

    assertThat(actualValue.plus(2, ChronoUnit.HOURS))
      .isEqualTo(expectedValue);
}

In ähnlicher Weise kann dieminus()-Methode zum Subtrahieren eines bestimmtenTemporalAmount verwendet werden.

5. Apache CommonsDateUtils

Die KlasseDateUtils aus der Apache Commons Lang-Bibliothek macht einestaticaddHours()-Methode verfügbar:

public static Date addHours(Date date, int amount)

Die Methode nimmt einjava.util.Date-Objekt zusammen mit einemamount auf, das wir hinzufügen möchten, dessen Wert entweder positiv oder negativ sein kann.

Ein neuesjava.util.Date-Objekt wird als Ergebnis zurückgegeben:

@Test
public void givenJavaUtilDate_whenUsingApacheCommons_thenAddHours() {
    Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0)
      .getTime();
    Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0)
      .getTime();

    assertThat(DateUtils.addHours(actualDate, 2)).isEqualTo(expectedDate);
}

Die neueste Version vonApache Commons Lang ist unterMaven Central. verfügbar

6. Joda Zeit

Joda Time ist eine Alternative zur Java 8 DateTime-API und bietet eigeneDateTime-Implementierungen.

Die meisten der mitDateTimeverwandten Klassen legen die MethodenplusHours() undminusHours()offen, mit denen wir eine bestimmte Anzahl von Stunden zu einemDateTime-Objekt addieren oder subtrahieren können.

Schauen wir uns ein Beispiel an:

@Test
public void givenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours() {
    DateTime actualDateTime = new DateTime(2018, 5, 25, 5, 0);
    DateTime expectedDateTime = new DateTime(2018, 5, 25, 7, 0);

    assertThat(actualDateTime.plusHours(2)).isEqualTo(expectedDateTime);
}

Wir können die neueste verfügbare Version vonJoda Time leicht unterMaven Central überprüfen.

7. Fazit

In diesem Lernprogramm haben wir verschiedene Möglichkeiten beschrieben, wie Sie eine bestimmte Anzahl von Stunden zu Standard-Java-Datums- / Uhrzeitwerten hinzufügen oder von diesen abziehen können.

Als Alternative haben wir uns auch einige Bibliotheken von Drittanbietern angesehen. Wie üblich ist der vollständige Quellcodeover on GitHub verfügbar.