2017-05-07 7 views
1
public static void main(String[] args) { 

    LocalDateTime ldt = LocalDateTime.now(); 

    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault()); 

    Instant instant = Instant.from(zdt); 

    Timestamp timestamp = Timestamp.from(instant); 

    System.out.println(ldt + "\n"); 

    System.out.println(zdt + "\n"); 

    System.out.println(instant + "\n"); 

    System.out.println(timestamp + "\n"); 
} 

そして、それは印刷します。UTC時刻をjava.sql.Timestampにするにはどうすればよいですか?

2017-05-07T18:13:26.969 

2017-05-07T18:13:26.969-04:00[America/New_York] 

2017-05-07T22:13:26.969Z 

2017-05-07 18:13:26.969 

にはどうすればInstantと同じ時間で保存SQL Timestampを作ることができますか?私はTimestampをどこからでも得ることができる必要があり、それは世界のその部分で起こっている何時でもそれを変換する必要があります。問題は、システムクロックが設定された時刻と同じ時刻に保存し続けることです。

答えて

4

Instantからではなく、をLocalDateTimeから取得することをお勧めします。

最初のステップは、あなたのZonedDateTimeを取り、GMTに変換することです:

ZonedDateTime gmt = zdt.withZoneSameInstant(ZoneId.of("GMT")); 

次にあなたがLocalDateTime経由Timestampに変換することができます:

Timestamp timestamp = Timestamp.valueOf(gmt.toLocalDateTime()); 
+0

これは助けになりました。 'インスタント'は現在のUTC時刻を表示するので全然欺かれていましたが、 'タイムスタンプ 'に変換されたときに私の現地時間が表示されました。だから、リモートDBに保存すると、それは私がどこにいるかはいつでも変わりません。 'Timestamp'にはタイムゾーンがなく、' Instant'はエポックからのオフセットですが、 'Timestamp'が現在のUTC時刻ではなくローカル時刻として現在時刻を記録するのは全く無意味です。私はそれがタイムゾーンを表示するはずだと思っていたと自動的にみなしたので、ポーズするのは難しい質問でした。 – DayTripperID

+0

これはタイムスタンプのローカルタイム変換の問題を解決するのに役立ちました。私はこれが変換を誇張しているのかどうかは分かりませんが、次のチェーンは、UTCにあった格納されたlongを変換し、インスタントからではなくLDTを使用してTimestampに変換します: 'Timestamp.valueOf( \t \t LocalDateTime。 ofEpochSecond(longEpochVal、0、ZoneOffset.UTC)) ' –

0

あなたが使用する必要があります「TIMESTAMP WITH TIME ZONE」値を表現する場合は、Calendarオブジェクトを受け取るsetTimestampの特定のオーバーロードが発生します。

関連する問題