日付をLocalDateまたはLocalDateTimeに変換して戻す

日付をLocalDateまたはLocalDateTimeに変換して戻す

1. 概要

Java 8以降、新しいDate API –java.timeがあります。

ただし、新しいAPIと古いAPIの間で変換を実行し、両方の日付表現を使用する必要がある場合があります。

参考文献:

新しいJava 8 Date Time APIへの移行

Java8の新しいDateTimeAPIへの移行に関する迅速で実用的なガイド。

Java 8 Date / Time APIの概要

この記事では、日付と時刻の新しいJava 8 APIと、日付と時刻の構築と操作がどれほど簡単かを見ていきます。

2. java.util.Datejava.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 objectofEpochMilli()メソッドを使用:

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.Datejava.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.LocalDatejava.util.Dateに変換します

古いデータ表現から新しいデータ表現に変換する方法を十分に理解したので、別の方向への変換を見てみましょう。

LocalDateDateに変換する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オブジェクトを使用しており、この変換を行うときはタイムゾーンにも注意する必要があることに気付くでしょう。

次に、非常によく似たソリューションを使用して、LocalDateTimeDateオブジェクトに変換しましょう。

5. java.time.LocalDateTimejava.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.Datejava.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.LocalDatejava.time.LocalDateTimeに変換する方法と、その逆の方法について説明しました。

この記事の完全な実装は、over on Githubで入手できます。