gpt4 book ai didi

java - Oracle/JDBC : Problem with correct Timezone of rows

转载 作者:行者123 更新时间:2023-12-01 19:41:15 25 4
gpt4 key购买 nike

我有一个表 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

最佳答案

时区 CET/CEST 于 2019 年 3 月 31 日 02:00:00 切换为夏令时,因此从 02:00:00 跳到 03:00:00。

getDate 返回一个 java.sql.Date,它是 2019-03-31 午夜的 java.util.Date,因此无夏令时。

getTime 返回一个 java.sql.Time,它是给定时间 1970-01-01 的 java.util.Date,所以没有夏令时。

getTimestamp 返回一个 java.sql.Timestamp,它是给定日期和时间的 java.util.Date,因此应用 DST ,将 02:00 更改为 03:00。但是,数据库中的值没有时区,因此其余值不会发生变化。这是处理 TIMESTAMP WITH LOCAL TIME ZONE 时的缺陷。

java.sql.Timestamp 转换为 java.time.Instant 会针对 DST 进行调整,因此会破坏时间。

请注意,TIMESTAMP WITH LOCAL TIME ZONE 不存储时区,它只是告诉客户端 API 代表您转换为 session 时区。数据库中的实际值取决于数据库时区,而不是客户端时区或 session 时区。

关于java - Oracle/JDBC : Problem with correct Timezone of rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com