日付をLocalDateまたはLocalDateTimeに変換して戻す
1. 概要
Java 8以降、新しいDate API –java.timeがあります。
ただし、新しいAPIと古いAPIの間で変換を実行し、両方の日付表現を使用する必要がある場合があります。
参考文献:
2. java.util.Dateをjava.time.LocalDateに変換する
古い日付表現を新しい表現に変換することから始めましょう。
ここでは、Java 8の新しいtoInstant() method which was added to java.util.Dateを利用できます。
Instantobject, it’s required to use a ZoneId, because _ _Instant objects are timezone-agnosticを変換するときは、タイムライン上のポイントだけです。
InstantオブジェクトからのatZone(ZoneId zone) APIはZonedDateTime–を返すため、toLocalDate()メソッドを使用してLocalDateを抽出する必要があります。
ここでの最初の例では、デフォルトのシステムZoneId:を使用しています
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
A similar solution to the above one, but with a different way of creating an Instant object –ofEpochMilli()メソッドを使用:
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
先に進む前に、old java.sql.Dateクラスと、それをLocalDateに変換する方法についても簡単に見てみましょう。
Java 8以降、java.sql.Dateに追加のtoLocalDate()メソッドがあります。これにより、java.time.LocalDateに変換する簡単な方法も得られます。
この場合、タイムゾーンについて心配する必要はありません。
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
同様に、古いDateオブジェクトをLocalDateTimeオブジェクトに変換することもできます。次にそれを見てみましょう。
3. java.util.Dateをjava.time.LocalDateTimeに変換する
LocalDateTimeインスタンスを取得するには、同様にan intermediary ZonedDateTime, and then using the toLocalDateTime() APIを使用できます。
前と同じように、java.util.DateからInstantオブジェクトを取得する2つの可能な解決策を使用できます。
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
また、Java 8以降、use java.sql.Timestamp to obtain a LocalDateTimeも実行できます。
ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
return new java.sql.Timestamp(
dateToConvert.getTime()).toLocalDateTime();
}
4. java.time.LocalDateをjava.util.Dateに変換します
古いデータ表現から新しいデータ表現に変換する方法を十分に理解したので、別の方向への変換を見てみましょう。
LocalDateをDateに変換する2つの可能な方法について説明します。
最初の例では、LocalDateをパラメーターとして受け取る新しいvalueOf(LocalDate date) method provided injava.sql.Dateオブジェクトを使用します。
public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
return java.sql.Date.valueOf(dateToConvert);
}
ご覧のとおり、簡単で直感的です。 変換にローカルタイムゾーンを使用します(すべてが内部で行われるため、心配する必要はありません)。
別のJava8の例では、from(Instant instant)method ofjava.util.Dateオブジェクトに渡すInstantオブジェクトを使用します。
public Date convertToDateViaInstant(LocalDate dateToConvert) {
return java.util.Date.from(dateToConvert.atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
}
ここではInstantオブジェクトを使用しており、この変換を行うときはタイムゾーンにも注意する必要があることに気付くでしょう。
次に、非常によく似たソリューションを使用して、LocalDateTimeをDateオブジェクトに変換しましょう。
5. java.time.LocalDateTimeをjava.util.Dateに変換します
a java.util.Date from LocalDateTime is to use an extension to thejava.sql.Timestampを取得する最も簡単な方法– Java 8で利用可能:
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
return java.sql.Timestamp.valueOf(dateToConvert);
}
しかしもちろん、別の解決策はan Instant object – which we obtain from ZonedDateTimeを使用することです。
Date convertToDateViaInstant(LocalDateTime dateToConvert) {
return java.util.Date
.from(dateToConvert.atZone(ZoneId.systemDefault())
.toInstant());
}
6. Java9の追加
Java 9では、java.util.Dateとjava.time.LocalDateまたはjava.time.LocalDateTimeの間の変換を簡素化する新しいメソッドが利用可能です。
LocalDate.ofInstant(Instant instant, ZoneId zone)およびLocalDateTime.ofInstant(Instant instant, ZoneId zone)は、便利なショートカットを提供します。
public LocalDate convertToLocalDate(Date dateToConvert) {
return LocalDate.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
public LocalDateTime convertToLocalDateTime(Date dateToConvert) {
return LocalDateTime.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
7. 結論
このチュートリアルでは、古いjava.util.Dateを新しいjava.time.LocalDateとjava.time.LocalDateTimeに変換する方法と、その逆の方法について説明しました。
この記事の完全な実装は、over on Githubで入手できます。