【发布时间】:2019-03-25 20:28:03
【问题描述】:
我有一个表 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。 唯一正确的时间是 tm。
这是为什么呢?这里有什么问题?
JRE 1.8 甲骨文 12c 具有本地时区 CET/CEST 的 Linux
【问题讨论】:
-
我建议您切换到 Java 8(和 JDBC 4.2)中引入的
java.time.LocalTime、java.time.LocalDate和java.time.LocalDateTime。