1. 概要

Java 8以降、新しいDateAPIがあります:java.time

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

2. java.util.Datejava.time.LocalDateに変換しています

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

ここでは、Java8のjava.util.Dateに追加されたnew toInstant()メソッドを利用できます。

Instant オブジェクトを変換する場合、Instantオブジェクトはタイムゾーンに依存しないであるため、ZoneIdを使用する必要があります。

InstantオブジェクトのatZone(ZoneId zone)APIはZonedDateTime を返すため、LocalDateをLocalDateを使用して抽出する必要があります。 X164X] toLocalDate()メソッド。

まず、デフォルトのシステム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.Datejava.time.LocalDateTimeに変換しています

LocalDateTime インスタンスを取得するには、同様に中間のZonedDateTimeを使用してから、toLocalDateTime()APIを使用できます。

前と同じように、2つの可能な解決策を使用して、java.util.DateからInstantオブジェクトを取得できます。

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

1582年10月10日より前の日付の場合、Calendarをグレゴリオ暦として設定し、メソッド setGregorianChange():を呼び出す必要があることに注意してください。

GregorianCalendar calendar = new GregorianCalendar();
calendar.setGregorianChange(new Date(Long.MIN_VALUE));
Date dateToConvert = calendar.getTime();

また、Java 8以降では、java.sql.Timestampを使用してLocalDateTimeを取得することもできます。

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

4. java.time.LocalDatejava.util.Dateに変換します

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

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

最初に、 java.sql.Dateオブジェクトで提供される新しいvalueOf(LocalDate date)メソッドを使用します。このメソッドは、LocalDateをパラメーターとして受け取ります。

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

ご覧のとおり、簡単で直感的です。 変換にはローカルタイムゾーンを使用します(すべてが内部で行われるため、心配する必要はありません)。

別のJava8の例では、[X31X] from(Instant Instant)メソッドのjava.util.Date[に渡すInstantオブジェクトを使用します。 X149X]オブジェクト:

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

ここではInstantオブジェクトを使用していることに注意してください。また、この変換を行うときはタイムゾーンにも注意する必要があります。

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

5. java.time.LocalDateTimejava.util.Dateに変換します

LocalDateTimeからjava.util.Dateを取得する最も簡単な方法は、 java.sql.Timestamp の拡張機能を使用することです—Java8で使用できます。

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

ただし、もちろん、別の解決策は、ZonedDateTimeから取得したInstantオブジェクトを使用することです。

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(インスタントインスタント、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に変換する方法についても説明しました。逆に。

この記事の完全な実装は、GitHubから入手できます。