Hinzufügen von Stunden zu einem Datum in Java

1. Übersicht

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

Dann führte Java 8 java.time.LocalDateTime und java.time.ZonedDateTime ein. Mit Java 8 können wir auch eine bestimmte Zeit auf der Timeline mit java.time.Instant darstellen.

In diesem Tutorial lernen wir, n Stunden von einer bestimmten Datums- und Uhrzeitangabe in Java zu addieren oder zu subtrahieren . Wir werden uns zunächst einige Standardklassen für das Datum und die Uhrzeit von Java ansehen und dann einige Optionen von Drittanbietern vorstellen.

Um mehr über die Java 8 DateTime-API zu erfahren, empfehlen wir Ihnen, diesen Artikel zu lesen.

2. java.util.Date

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

Mal sehen, wie man einem bestimmten Date- Objekt n Stunden hinzufügt :

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, dass sich Calendar.HOUR_OF_DAY auf eine 24-Stunden-Uhr bezieht .

Die obige Methode gibt ein neues Datumsobjekt zurück , dessen Wert entweder (Datum + Stunden) oder (Datum - Stunden) ist , je nachdem, ob wir einen positiven oder einen negativen Wert von Stunden übergeben .

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

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

  1. Verwenden Sie die Methode java.util.Date toInstant () , um ein Date- Objekt in eine java.time.Instant- Instanz zu konvertieren
  2. Fügen Sie eine bestimmte Dauer an das java.time.Instant Objekt mit dem Pluszeichen () Methode
  3. Stellen Sie unsere Instanz java.util.Date wieder her, indem Sie das Objekt java.time.Instant an die Methode java.util.Date.from () übergeben

Lassen Sie uns einen kurzen Blick auf diesen Ansatz werfen:

@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, dass es immer empfohlen wird, die neue DateTime-API für alle Anwendungen unter Java 8 oder höher zu verwenden.

3. java.time.LocalDateTime / ZonedDateTime

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

@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 Methode plusHours () reicht völlig aus . Es wird jedoch empfohlen, die Methode minusHours () 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 Methoden plusHours () und minusHours () in java.time.ZonedDateTime funktionieren genauso.

4. java.time.Instant

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

Um einem Instant- Objekt einige Stunden hinzuzufügen , können wir seine plus () -Methode mit einem java.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 die minus () -Methode zum Subtrahieren eines bestimmten TemporalAmount verwendet werden .

5. Apache Commons DateUtils

Die DateUtils- Klasse aus der Apache Commons Lang-Bibliothek macht eine statische addHours () -Methode verfügbar :

public static Date addHours(Date date, int amount)

Die Methode nimmt ein java.util.Date- Objekt zusammen mit einem Betrag auf, den wir hinzufügen möchten, dessen Wert entweder positiv oder negativ sein kann.

Ein neues java.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 von Apache Commons Lang ist bei Maven Central erhältlich.

6. Joda Time

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

Die meisten DateTime- bezogenen Klassen legen die Methoden plusHours () und minusHours () offen , mit denen wir eine bestimmte Anzahl von Stunden zu einem DateTime- Objekt hinzufügen oder daraus entfernen 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 von Joda Time bei Maven Central leicht überprüfen .

7. Fazit

In diesem Tutorial haben wir verschiedene Möglichkeiten behandelt, eine bestimmte Anzahl von Stunden zu Standard-Java-Datums- / Uhrzeitwerten zu addieren oder von diesen zu subtrahieren.

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