web-dev-qa-db-ja.com

Java.sql.timestampをLocalDate(Java8)Java.timeに変換する方法は?

Java 8では、TimestampJava.sql)をLocalDateJava.time)に変換するにはどうすればよいですか?

108
simonides

できるよ:

timeStamp.toLocalDateTime().toLocalDate();
170
assylias

タイムゾーンを考慮して、@ assyliasの回答を少し拡張します。特定のタイムゾーンのLocalDateTimeを取得するには、少なくとも2つの方法があります。

アプリケーション全体にsetDefaultタイムゾーンを使用できます。タイムスタンプ-> Java.time変換の前に呼び出す必要があります。

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

または、toInstant.atZoneチェーンを使用できます。

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
7
Pavel

受け入れられた答えは理想的ではないので、2セントを追加することにしました

timeStamp.toLocalDateTime().toLocalDate();

一般的に悪い解決策です、システムのタイムゾーンを使用して暗黙的な変換を行うことで物事を本当に混乱させるので、なぜこのメソッドをJDKに追加したのかさえ分かりません。通常、Java8の日付クラスのみを使用する場合、プログラマはタイムゾーンを指定する必要がありますが、これは良いことです。

良い解決策は

timestamp.toInstant().atZone(zoneId).toLocalDate()

zoneIdは使用するタイムゾーンで、通常はZoneId.systemDefault()システムのタイムゾーンまたはZoneOffsetのようなハードコードされたタイムゾーンを使用する場合.UTC

一般的なアプローチは

  1. 直接関連するクラスを使用して、新しいJava8日付クラスに自由になります。私たちの場合Java.time.InstantはJava.sql.Timestampに直接関連しています、つまり、タイムゾーン変換はそれらの間で必要ありません。
  2. このJava8クラスで適切に設計されたメソッドを使用して、正しいことを行います。私たちの場合、atZone(zoneId)は、変換を行い、特定のタイムゾーンを使用していることを明示的にしました。
5
Ruslan