1概要

Java 8以降、新しいDate API – java.timeが導入されました。

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


2

java.util.Date

から

java.time.LocalDate


への変換

古い日付表現を新しいものに変換することから始めましょう。

ここでは、Java 8の

java.util.Date


に追加された新しい


toInstant()

metho

__d

__を利用できます。



Instant



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

Z

Instant

オブジェクトはタイムゾーンにとらわれない


タイムライン上のポイントにすぎないため、ZoneId__を使う必要があります。


Instant

オブジェクトの

atZone(ZoneId zone)

APIは

ZonedDateTime




を返すので、

toLocalDate()

メソッドを使用してそこから

LocalDate

を抽出する必要があります。

ここでの最初の例では、デフォルトのシステム__ZoneIdを使用しています。

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
    return dateToConvert.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

  • 上記と同じような解決策ですが、

    Instant

    オブジェクトを作成する方法が異なります。**

    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

インスタンスを取得するために – 私たちは同様に**

中間の

ZonedDateTime、

、そして

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以降、

LocalDateTime

** を取得するために

java.sql.Timestamp

を使用することもできます。

ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
    return new java.sql.Timestamp(
      dateToConvert.getTime()).toLocalDateTime();
}


4

java.time.LocalDate



java.util.Date


に変換します.

古いデータ表現から新しいデータ表現への変換方法をよく理解できたので、次に、別の方向への変換について見ていきましょう。


LocalDate



Date

に変換する2つの方法について説明します。

最初のものでは、パラメータとして

LocalDate

を取る




java.sql.Date

objectで提供される新しい


valueOf(LocalDate date)

メソッドを使用します。

public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
    return java.sql.Date.valueOf(dateToConvert);
}

見ての通り、それは楽で直感的です。それは変換のためにローカルタイムゾーンを使用します(すべてはフードの下で行われ、心配する必要はありません)。

もう1つのJava 8の例では、




java.util.Date

オブジェクトの



from(Instant instant)


メソッドに渡す

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


に変換します.


LocalDateTime

から

java.util.Date

を取得する最も簡単な方法は、Java 8で利用可能な




java.sql.Timestamp ** の拡張を使用することです。

public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
    return java.sql.Timestamp.valueOf(dateToConvert);
}

しかし、もちろん、別の解決策は、

Instant

オブジェクトを使用することです。これは、

ZonedDateTime

** から取得します。

Date convertToDateViaInstant(LocalDateTime dateToConvert) {
    return java.util.Date
      .from(dateToConvert.atZone(ZoneId.systemDefault())
      .toInstant());
}


6. Java 9の追加機能

Java 9では、

java.util.Date



java.time.LocalDate

または

java.time.LocalDateTime

との間の変換を簡単にする新しいメソッドが利用可能です。



LocalDate.ofInstant(インスタントインスタント、ZoneIdゾーン)


および


LocalDateTime.ofInstant(インスタントインスタント、ZoneIdゾーン)


は便利なショートカットを提供します。

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

に変換する方法と、それ以外の方法について説明しました。

この記事の完全な実装はhttps://github.com/eugenp/tutorials/tree/master/java-dates[over Github]で利用可能です。