0

ZonedDateTimeを SQL に変換Timestampし、タイムゾーン情報を保持するにはどうすればよいですか? UTC ゾーン時刻を取得して に変換してからTimestamp元に戻そうとしていますが、 に変換するとTimestampタイム ゾーン情報が失わTimestampれ、ローカル タイム ゾーンを使用して が作成されます。

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レコードが正しいタイム ゾーン情報を使用していることを確認するにはどうすればよいですか?

4

1 に答える 1

2

タイムスタンプに変換すると、タイム ゾーン情報が失われ、ローカル タイム ゾーンを使用してタイムスタンプが作成されます

いいえ。オリジナルZonedDateTime zdtUTCを に変換するjava.sql.Timestampと、同じ瞬間が得られます。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

于 2017-05-07T20:41:04.563 に答える