2017-05-07 26 views
0

ZonedDateTimeをどのようにしてSQL Timestampに変換し、タイムゾーン情報を保持しますか? 私は、UTCゾーニング時間がかかるTimestampに変換した後、戻ってそれを変換しようとしていますが、私はTimestampに変換するとき、それはタイムゾーン情報を失い、Timestampは私のローカルタイムゾーンを使用して作成されます。UTCタイムスタンプを保存するにはどうすればよいですか?

public static void main(String[] args) { 

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a"); 

    ZonedDateTime zdtUTC = ZonedDateTime.now(ZoneId.of("UTC")); 

    ZonedDateTime zdtNY = zdtUTC.withZoneSameInstant(ZoneId.of("America/New_York")); 
    ZonedDateTime zdtAZ = zdtUTC.withZoneSameInstant(ZoneId.of("America/Phoenix")); 
    ZonedDateTime zdtUK = zdtUTC.withZoneSameInstant(ZoneId.of("Europe/London")); 

    System.out.println(formatter.format(zdtUTC) + " in UTC zone"); 
    System.out.println(formatter.format(zdtNY) + " in New York, NY"); 
    System.out.println(formatter.format(zdtAZ) + " in Phoenix, AZ"); 
    System.out.println(formatter.format(zdtUK) + " in London, UK"); 

    Timestamp timestamp = Timestamp.from(zdtUTC.toInstant()); 

    LocalDateTime converted = timestamp.toLocalDateTime(); 
    ZonedDateTime convertedZdt = ZonedDateTime.of(converted, ZoneId.of("UTC")); 

    System.out.println(timestamp); 

    System.out.println(formatter.format(convertedZdt) + " in UTC zone"); 

} 

06:33 PM in UTC zone 
02:33 PM in New York, NY 
11:33 AM in Phoenix, AZ 
07:33 PM in London, UK 
2017-05-07 14:33:06.745 
02:33 PM in UTC zone 

正確なタイムゾーン情報を使用してTimestampレコードが確実に記録されるようにするには、何が必要ですか?

+0

あなたは '&server Timezone = UTCを使用することができます。成功とのLegacy Date time Code = false' –

+1

SQLタイムスタンプはタイムゾーンを持っていません - ちょうど瞬間です。別にタイムゾーンが必要な場合は、タイムゾーンIDを別の列に保存することをおすすめします。その時点でオフセットだけを気にしているなら、それを保存することができますが、タイムゾーンを保存するのと同じではないことに注意する必要があります。 –

+0

タイムゾーンを保存するのと同じではないことは分かっていますが、UTCゾーンでその瞬間に何時に絶対時間を保存できるようにする必要があります。データベーステーブルを変更することはできません。だから私がニューヨークにいて、ニューヨークの午後3時であれば、それは11 AMとして保管する必要があります。同様に、私がロンドンにいて、午後4時であれば、3PMとして保管する必要があります。それ以外の場合は、データベースから 'Timestamp'を取得する際に参照ポイントがありません。 – DayTripperID

答えて

2

私はタイムスタンプに変換するとき、それはあなたがjava.sql.Timestampに元ZonedDateTime zdtUTCを変換するときは、同じ瞬間を得るタイムゾーン情報とタイムスタンプが私のローカルタイムゾーンを使用して作成され

番号を失います時間内にこれは、直接timestamp値をフォーマットして表示することによって確認することができます:あなたの出力の最初の行と同じ値を出力します

Timestamp timestamp = Timestamp.from(zdtUTC.toInstant()); // as before 
// verify the timestamp value directly 
java.text.SimpleDateFormat sdfUTC = new java.text.SimpleDateFormat("hh:mm a z"); 
sdfUTC.setCalendar(java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC"))); 
System.out.printf("timestamp is %s%n", sdfUTC.format(timestamp)); 

それ:

08:30 PM in UTC zone 
... 
timestamp is 08:30 PM UTC 

それは当時LocalDateTimeに後続の変換だとZonedDateTimeには、タイムゾーン情報が「失われます」。

関連する問題