У меня есть таблица TAB с меткой времени (DT) и значением (VAL) на строку.
DT NOT NULL TIMESTAMP(0) WITH LOCAL TIME ZONE
VAL NOT NULL NUMBER
Я пытаюсь прочитать и получить метки времени в формате UTC.
SELECT SYS_EXTRACT_UTC (dt) AS dtm, val FROM mytab;
Результат в Sqlplus выглядит нормально для меня.
DTM VAL
---------------------------
30.03.19 23:00:00 124
31.03.19 00:00:00 125
31.03.19 01:00:00 126
31.03.19 02:00:00 127
31.03.19 03:00:00 128
31.03.19 04:00:00 129
31.03.19 05:00:00 130
Теперь я делаю то же самое в Java / JDBC.
java.sql.Timestamp ts = rs.getTimestamp ("dtm");
java.util.Date dt = rs.getDate ("dtm");
java.util.Date tm = rs.getTime ("dtm");
ZonedDateTime zdt = ts.toInstant ().atZone (ZoneOffset.UTC);
System.out.println("ts="+ts.toString() + " val="+rs.getDouble("wert") +
" dt=" + dt.toString() + " tm=" + tm.toString() +" zdt="+zdt);
И результат не тот, который я ожидал в отношении часовых поясов.
ts=2019-03-30 23:00:00.0 val=124.0 dt=2019-03-30 tm=23:00:00 zdt=2019-03-30T22:00Z
ts=2019-03-31 00:00:00.0 val=125.0 dt=2019-03-31 tm=00:00:00 zdt=2019-03-30T23:00Z
ts=2019-03-31 01:00:00.0 val=126.0 dt=2019-03-31 tm=01:00:00 zdt=2019-03-31T00:00Z
ts=2019-03-31 03:00:00.0 val=127.0 dt=2019-03-31 tm=02:00:00 zdt=2019-03-31T01:00Z
ts=2019-03-31 03:00:00.0 val=128.0 dt=2019-03-31 tm=03:00:00 zdt=2019-03-31T01:00Z
ts=2019-03-31 04:00:00.0 val=129.0 dt=2019-03-31 tm=04:00:00 zdt=2019-03-31T02:00Z
ts=2019-03-31 05:00:00.0 val=130.0 dt=2019-03-31 tm=05:00:00 zdt=2019-03-31T03:00Z
Почему у ts есть двойной 3?Я ожидаю, что это будет в UTC.Единственное правильное время в тм.
Почему это?В чем здесь проблема?
JRE 1.8 Oracle 12c Linux с локальным часовым поясом CET / CEST