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


回答:


195

できるよ:

timeStamp.toLocalDateTime().toLocalDate();

timestamp.toLocalDateTime() Clock.systemDefaultZone()タイムゾーンを使用して変換を行うことに注意してくださいこれは必要な場合とそうでない場合があります。


1
これは、Java 8で追加されています
assylias

54
timestamp.toLocalDateTime()ちなみに、このメソッドはsystemDefaultタイムゾーンを使用して変換を行います。これは必要な場合とそうでない場合があります。
jacobhyphenated 2014

1
@jacobhyphenated明示的なタイムゾーンを使用して回答を投稿してください。ありがとう!
user482745

@jacobhyphenatedのコメントはここで非常に重要であるため、賛成票の数です。詳細については私の答えを参照してください。stackoverflow.com/ a / 57101544/2032701
Ruslan

@jacobhyphenated、LocalDateTime常にシステムのデフォルトのタイムゾーンを使用します。それが「ローカル」という名前の意味です。
M.プロホロフ

20

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

timeStamp.toLocalDateTime().toLocalDate();

は一般的悪い解決策です。システムのタイムゾーンを使用して暗黙的な変換を行うと混乱を招くため、JDKにこのメソッドを追加した理由はわかりません。通常、java8日付クラスのみを使用する場合、プログラマーはタイムゾーンを指定することを強いられますが、これは良いことです。

良い解決策は

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

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

一般的なアプローチは

  1. たとえば、ここではjava.time.Instantがjava.sql.Timestamp直接関連している、つまりタイムゾーン変換が必要ない場合など、直接関連しているクラスを使用して、新しいjava8日付クラスに自由にアクセスします。
  2. このjava8クラスで適切に設計されたメソッドを使用して、正しいことを行います。今回のケースでは、atZone(zoneId)により、変換を実行し、特定のタイムゾーンを使用することが明示されました。

1
同意しません。タイムスタンプ(および日付)にはゾーン情報がありません。LocalDateにはゾーン情報がないため、2つは同等です。それらの間の変換は、特定のゾーンとは無関係に実行できます。LocalDateに変換する前にZonedDateTimeに変換すると、タイムゾーンが追加されてから再びオフになります。そのようにすると、厄介な-見つけにくいエラーが発生する可能性が高くなります。
AutomatedMike

5
@AutomatedMikeタイムスタンプ(および日付)は、UTCの特定の時点を表します。LocalDateは特定の時点を表すのではなく、壁掛け時計に表示される時間を表します。彼らのjavadocを読んでください。「それらの間の変換は、特定のゾーンとは無関係に行うことができます」-trueではありません。新しいTimestamp(0L).toLocalDateTime()は、モスクワのタイムゾーンに対して「1970-01-01T03:00」を返します。結果はタイムゾーンによって異なる場合があります。
ルスラン

1
@AutomatedMike toLocalDate()を実行して時間を取り除いたとしても、Timestampに真夜中の時刻がある場合、新しいTimestamp(1000 * 60 * 60 * 23).toLocalDateTime()。toLocalDateのように、その日が間違っていることを証明するのは簡単です()は、UTCで「1970-01-01」の場合、モスクワのタイムゾーンで「1970-01-02」を返します。
ルスラン

1
@AutomatedMikeは、「タイムゾーンを追加してから、それを再びオフにする」-タイムゾーンを追加および削除するのではなく、明示的なタイムゾーンを使用して、異なる概念間で変換することが重要です。これは、タイムゾーンが暗黙的に適用される前の2つのコメントの例とは対照です。
ルスラン

7

@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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.