我在Oracle DB(12.2)中将dbtimezone保留为“ -07:00”和“ America / Los_Angeles”,并使用“ TIMESTAMP WITH LOCAL TIME ZONE”检索了一个列,该列为我提供了不同的值。显示相差8分钟。请在查询下方找到。
ALTER DATABASE ORCL SET TIME_ZONE='America/Los_Angeles';
关闭并启动
创建用户并使用TIMESTAMP WITH LOCAL TIME ZONE
create table t_ts(id int, ts timestamp with local time zone, tst timestamp with time zone);
insert into t_ts values(1, timestamp '0912-02-29 02:02:10.089', timestamp '0912-02-29 02:02:10.089');
我发送查询并使用JDBC获取行,它给了我
ID: 1
Epoch time: -33381730189911
TS: 0912-02-29 01:10:10.089
现在,我删除表和用户,然后将dbtimezone设置为“ -07:00”并执行相同的操作。它给了我不同的结果。
ID: 1
Epoch time: -33381730669911
TS: 0912-02-29 01:02:10.089
我有两个问题:
1)如何在使用JDBC带来时间戳的同时禁用夏令时。(一小时的差异是因为给定时间在DST之下)
2)为什么相差8分钟?
JDBC版本:
Oracle 12.2.0.1.0 JDBC 4.2 compiled with javac 1.8.0_91 on Tue_Dec_13_06:08:31_PST_2016
我的JDBC代码如下:
ResultSet rs=stmt.executeQuery("select * from t_ts");
while(rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
Timestamp ts = rs.getTimestamp("ts");
System.out.println("Epoch time: " + ts.getTime());
System.out.println("TS: " + ts);
}
答案 0 :(得分:1)
也许看看IANA Time Zone Database,它也被Oracle数据库使用。
对于America/Los_Angeles
,您会看到以下条目:
来自Paul Eggert(2018-03-20): 陶氏的提议遗漏了许多细节,例如绘制位置 时区之间的界线。设定时区的关键人物 在美国的工作是铁路工程师William Frederick Allen 《旅行者指南》的执行编辑,以及 铁路标准化组织General Time Convention。艾伦 与科学和铁路领导人进行了数月的对话, 制定了建立时区的可行计划,并提出了 在1883-04-11的《通用时间公约》上说,他的计划 表示“实际上将废除当地时间”-对于 铁路调度。根据1883-10-11的下次会议,几乎所有 铁路商定并于1883-11-18生效。那个星期天 被称为“两个中午的一天”,因为某些地点在中午观察到 两次。艾伦目睹了纽约市的过渡,写道:
我听到了旧时圣保罗罢工的钟声。四个 分钟后,服从海军的电信号 天文台...时球迅速下降,编钟 三位一体的老手响了十二个中风,当地时间是 放弃,也许永远。
美国大部分地区也紧随其后。看到: Bartky IR。通过标准时间。 Technol Cult 1989年1月; 30(1):25-56。 https://dx.doi.org/10.2307/3105430
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER Rule CA 1948 only - Mar 14 2:01 1:00 D Rule CA 1949 only - Jan 1 2:00 0 S Rule CA 1950 1966 - Apr lastSun 1:00 1:00 D Rule CA 1950 1961 - Sep lastSun 2:00 0 S Rule CA 1962 1966 - Oct lastSun 2:00 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/Los_Angeles -7:52:58 - LMT 1883 Nov 18 12:07:02 -8:00 US P%sT 1946 -8:00 CA P%sT 1967 -8:00 US P%sT
您会看到1883年11月18日之前的时区America/Los_Angeles
不是UTC-08:00
,而是UTC-07:52
(UTC的时区偏移量仅考虑小时/分钟,而不考虑秒)
当您在timestamp '0912-02-29 02:02:10.089'
或TIMESTAMP WITH TIME ZONE
列中输入TIMESTAMP WITH LOCAL TIME ZONE
时,Oracle实际上会执行
FROM_TZ(timestamp '0912-02-29 02:02:10.089', SESSIONTIMEZONE)
您输入的日期为0912-02-29
,该日期早于1883年,但我不知道您为什么会得到不同的结果。也许在某些时候,甲骨文忽略了America/Los_Angeles
不等于UTC-08:00
的情况,人们可以认为这是一个错误。
无论如何,Oracle建议设置DBTIMEZONE = UTC
,在我看来,其他任何设置都没有意义。