1.概要

Java 8より前は、

java.util.Date

は、Javaで日時値を表すために最も一般的に使用されているクラスの1つでした。

その後、Java 8では

java.time.LocalDateTime



java.time.ZonedDateTime.

が導入されました。Java8では、

java.time.Instant.

を使用してタイムライン上の特定の時刻を表すこともできます

このチュートリアルでは、Javaで特定の日時に

n

時間を加算または減算する方法を学びます。最初に標準的なJavaの日付と時刻に関連するクラスを見てから、いくつかのサードパーティのオプションを紹介します。

Java 8 DateTime APIの詳細については、https://www.baeldung.com/java-8-date-time-intro[この記事]を読んでください。

2.

java.util.Date

Java 7以下を使用している場合は、https://docs.oracle.com/javase/8/docs/api/java/util/Date.html[

java.util.Date

]およびhttps:/を使用できます。ほとんどの日時関連処理のための/docs.oracle.com/javase/6/docs/api/java/util/Calendar.html[

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

オブジェクトを返します。その値は、それぞれ

hours

の正または負の値を渡すかどうかに応じて、

(date hours)

または

(date – hours)

のいずれかになります。

Java 8アプリケーションがあるとしますが、それでも

java.util.Date

インスタンスを使って作業したいと思います。

そのような場合は、以下の代替アプローチをとることを選択できます。


  1. Date

    オブジェクトを変換するには、

    java.util.Date


    toInstant()

    メソッドを使用します.


java.time.Instant

インスタンスへ
。特定の

Duration



java.time.Instant

オブジェクトに追加します。


plus()

メソッド
。に渡して

java.util.Date

インスタンスを回復します。


java.util.Date.from()

メソッドへの

java.time.Instant

オブジェクト

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

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

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

3.

java.time.LocalDateTime/ZonedDateTime

Java 8以降では、


java.time.LocalDateTime

またはhttps://docsに時間を追加します。 oracle.com/javase/8/docs/api/java/time/Zoned DateTime.html[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);
}

数時間引くとどうなりますか?


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.ZonedDateTime



plusHours()

メソッドと

minusHours()

メソッドはまったく同じように機能します。

4.

java.time.Instant

私たちが知っているように、Java 8 DateTime APIで紹介されたhttps://docs.oracle.com/javase/8/docs/api/java/time/Instant.html[

java.time.Instant

]は、タイムライン上の特定の瞬間を表しています。


  • Instant

    オブジェクトに数時間を追加するには、https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAmount.html[

    javaを指定した

    plus()

    メソッドを使用できます。 .time.temporal.TemporalAmount

    ]:**

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

同様に、

minus()メソッドは、特定の

TemporalAmount__を減算するために使用できます。

5. Apache Commons

DateUtils

Apacheのhttps://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addHours-java.util.Date-int-[

DateUtils

]クラスCommons Langライブラリは

static


addHours()

メソッドを公開しています:

public static Date addHours(Date date, int amount)

このメソッドは、

java.util.Date

オブジェクトとそれに追加したい

amount

を取り入れます。その値は正または負のいずれかです。

新しい

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

の最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons-lang3で入手できます。 %22[メイヴン中央]

6.ジョダタイム


Joda Time

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


DateTime

関連クラスのほとんどは、

DateTime

オブジェクトから指定された時間数を加算または減算するのに役立つように、

plusHours()

および

minusHours()

メソッドを公開しています。

例を見てみましょう。

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


https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22joda-time%22%20AND%20a%3A%22joda-timeで


Joda Time

の最新バージョンを簡単に確認できます。 %22[メイヴン中央]。

7.まとめ

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

私達はまた代替としていくつかの第三者ライブラリを調べました。いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/java-dates[over Github]から入手できます。