Javaで日付に時間を追加する
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
インスタンスを使って作業したいと思います。
そのような場合は、以下の代替アプローチをとることを選択できます。
-
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]から入手できます。