1. 概要

Java 8より前は、 java.util.Date は、Javaで日時値を表すために最も一般的に使用されるクラスの1つでした。

その後、Java8が導入されました java.time.LocalDateTime java.time.ZonedDateTime。 Java 8では、を使用してタイムライン上の特定の時間を表すこともできます。 java.time.Instant。

このチュートリアルでは、Javaの特定の日時からn時間を加算または減算する方法を学習します。 最初にいくつかの標準Java日時関連クラスを見てから、いくつかのサードパーティオプションを紹介します。

Java 8 DateTime APIの詳細については、この記事を読むことをお勧めします。

2. java .util.Date

Java 7以下を使用している場合は、 java.util.Dateおよびjava.util.Calendarクラスをほとんどの日時関連に使用できます。取り扱い。

特定のDateオブジェクトにn時間を追加する方法を見てみましょう。

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

Calendar.HOUR_OF_DAYは24時間制を参照していることに注意してください。

上記のメソッドは、新しい Date オブジェクトを返します。このオブジェクトの値は、(日付+時間)または(日付–時間)のいずれかになります。それぞれ時間の正または負の値を渡します。

Java 8アプリケーションがあるが、それでもjava.util.Dateインスタンスを使用したいとします。

このような場合、次の代替アプローチを選択できます。

  1. java.util.Date toInstant()メソッドを使用して、Dateオブジェクトをjava.time.Instantインスタンスに変換します
  2. plus()メソッドを使用して、特定のdurationjava.time.Instantオブジェクトに追加します
  3. java.time.Instantオブジェクトをjava.util.Date.from()メソッドに渡すことにより、java.util.Dateインスタンスをリカバリします

このアプローチを簡単に見てみましょう。

@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);
}

ただし、Java8以降のバージョンのすべてのアプリケーションに新しいDateTimeAPIを使用することを常にお勧めします。

3. java .time.LocalDateTime / ZonedDateTime

Java 8以降では、java.time.LocalDateTimeまたはjava.time.ZonedDateTimeインスタンスに時間を追加するのは非常に簡単で、 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);
}

数時間を減算したい場合はどうなりますか?

負の値のhoursをplusHours()メソッドに渡すと問題ありません。 ただし、 minusHours()メソッドを使用することをお勧めします。

@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);

}

java.time.ZonedDateTimeplusHours()メソッドと minusHours()メソッドはまったく同じように機能します。

4. java .time.Instant

ご存知のように、Java 8DateTimeAPIで導入されたjava.time.Instantは、タイムライン上の特定の瞬間を表しています。

Instant オブジェクトに数時間を追加するには、 java.time.temporal.TemporalAmountでそのplus()メソッドを使用できます。

@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);
}

同様に、マイナス()メソッドは、特定のTemporalAmountを減算するために使用できます。

5. Apache Commons DateUtils

ApacheCommonsLangライブラリのDateUtilsクラスは、 static addHours()メソッドを公開します。

public static Date addHours(Date date, int amount)

このメソッドは、 java.util.Date オブジェクトと、それに追加したい amount を取り込みます。このオブジェクトの値は、正または負のいずれかになります。

new java.util.Dateオブジェクトが結果として返されます。

@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);
}

Apache Commons Lang の最新バージョンは、MavenCentralで入手できます。

6. ジョーダタイム

Joda Time は、Java 8 DateTime APIの代替であり、独自のDateTime実装を提供します。

そのDateTime関連クラスのほとんどは、 plusHours()および minusHours()メソッドを公開して、DateTimeから特定の時間数を加算または減算するのに役立ちますオブジェクト。

例を見てみましょう:

@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);
}

Joda Time の最新バージョンは、 MavenCentralで簡単に確認できます。

7. 結論

このチュートリアルでは、標準のJava日時値から特定の時間数を加算または減算するいくつかの方法について説明しました。

代わりに、いくつかのサードパーティライブラリも検討しました。 いつものように、完全なソースコードはGitHubから入手できます。