假设我正在使用Oracle SGBD (RDBMS)和Java 8。
我的历史日期时间存储在UTC时区,但我的应用程序只显示本地日期时间,我的统计计算也只适用于本地日期时间。
现在,假设DST规则在欧洲发生变化,按计划。
让我的应用程序和统计数据正常工作的最简单方法是什么?
到目前为止,我所读到的是在甲骨文和Java中都有与DST规则相关的时区,但是它们没有自动更新。此外,我想要做的是在变化前后保持规则,而不仅仅是更新规则,因为我需要历史数据,所以我需要“欧洲/巴黎之前的变化”时区和“欧洲/巴黎之后的变化”时区,或者更好的一个时区,一个与历史相关的规则适用于自己的需要。
而且,即使在Java中有一些方便的方法来实现这一点,也应该在Oracle中修复它,以涵盖所有的用例。
这里是芝加哥相关的历史规则变化之一。DST于一九五四年九月上周日结束,而十月份上星期日则由一九五五年(直至下一次规则变更)结束:
开始(时钟向前) -> DST结束(时钟向后) 1953年迪曼切26艾薇儿,02 h 00 -> dimanche 27 7,02 h 00 1954年dimanche 25 avril,02 h 00 -> dimanche 26 7,02 h 00 1955年dimanche 24 avril,02 h 00 -> dimanche 30 octobre,02 h 00 1956年dimanche 29 avril,02 h 00 -> dimanche 28 octobre,02 h 00
P.S.:我知道IANA历史时区数据库,但是如果您已经这样做了,请展示如何在Oracle和Java中实际使用它。
P.P.S.:任何关于在未来数据库中处理这个问题的比"UTC“更好的建议也是值得欢迎的。
发布于 2018-10-16 09:16:04
Java或Oracle将自动为任何UTC日期应用正确的规则--当然,只要您有最新的时区数据文件。
由于您询问了Oracle (SGBD/RDBMS)方法,并提到了芝加哥,因此生成时钟在不同规则下更改的示例日期非常简单,并确保更改适用于正确的日期(与添加到问题中的示例规则更改和https://www.timeanddate.com/time/zone/usa/chicago相比)。
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZH:TZM';
with t (utc) as (
select timestamp '1954-04-25 07:59:59 UTC' from dual
union all select timestamp '1954-04-25 08:00:00 UTC' from dual
union all select timestamp '1954-09-26 06:59:59 UTC' from dual
union all select timestamp '1954-09-27 07:00:00 UTC' from dual
--
union all select timestamp '1955-04-24 07:59:59 UTC' from dual
union all select timestamp '1955-04-24 08:00:00 UTC' from dual
union all select timestamp '1955-10-30 06:59:59 UTC' from dual
union all select timestamp '1955-10-30 07:00:00 UTC' from dual
--
union all select timestamp '1974-01-06 07:59:59 UTC' from dual
union all select timestamp '1974-01-06 08:00:00 UTC' from dual
union all select timestamp '1974-10-27 06:59:59 UTC' from dual
union all select timestamp '1974-10-27 07:00:00 UTC' from dual
--
union all select timestamp '1975-02-23 07:59:59 UTC' from dual
union all select timestamp '1975-02-23 08:00:00 UTC' from dual
union all select timestamp '1975-10-26 06:59:59 UTC' from dual
union all select timestamp '1975-10-26 07:00:00 UTC' from dual
--
union all select timestamp '1987-04-05 07:59:59 UTC' from dual
union all select timestamp '1987-04-05 08:00:00 UTC' from dual
union all select timestamp '1987-10-25 06:59:59 UTC' from dual
union all select timestamp '1987-10-25 07:00:00 UTC' from dual
--
union all select timestamp '2007-03-11 07:59:59 UTC' from dual
union all select timestamp '2007-03-11 08:00:00 UTC' from dual
union all select timestamp '2007-11-04 06:59:59 UTC' from dual
union all select timestamp '2007-11-04 07:00:00 UTC' from dual
)
select utc,
utc at time zone 'America/Chicago' as chicago
from t;这给了你:
UTC CHICAGO
-------------------------- --------------------------
1954-04-25 07:59:59 +00:00 1954-04-25 01:59:59 -06:00
1954-04-25 08:00:00 +00:00 1954-04-25 03:00:00 -05:00
1954-09-26 06:59:59 +00:00 1954-09-26 01:59:59 -05:00
1954-09-27 07:00:00 +00:00 1954-09-27 01:00:00 -06:00
1955-04-24 07:59:59 +00:00 1955-04-24 01:59:59 -06:00
1955-04-24 08:00:00 +00:00 1955-04-24 03:00:00 -05:00
1955-10-30 06:59:59 +00:00 1955-10-30 01:59:59 -05:00
1955-10-30 07:00:00 +00:00 1955-10-30 01:00:00 -06:00
1974-01-06 07:59:59 +00:00 1974-01-06 01:59:59 -06:00
1974-01-06 08:00:00 +00:00 1974-01-06 03:00:00 -05:00
1974-10-27 06:59:59 +00:00 1974-10-27 01:59:59 -05:00
1974-10-27 07:00:00 +00:00 1974-10-27 01:00:00 -06:00
1975-02-23 07:59:59 +00:00 1975-02-23 01:59:59 -06:00
1975-02-23 08:00:00 +00:00 1975-02-23 03:00:00 -05:00
1975-10-26 06:59:59 +00:00 1975-10-26 01:59:59 -05:00
1975-10-26 07:00:00 +00:00 1975-10-26 01:00:00 -06:00
1987-04-05 07:59:59 +00:00 1987-04-05 01:59:59 -06:00
1987-04-05 08:00:00 +00:00 1987-04-05 03:00:00 -05:00
1987-10-25 06:59:59 +00:00 1987-10-25 01:59:59 -05:00
1987-10-25 07:00:00 +00:00 1987-10-25 01:00:00 -06:00
2007-03-11 07:59:59 +00:00 2007-03-11 01:59:59 -06:00
2007-03-11 08:00:00 +00:00 2007-03-11 03:00:00 -05:00
2007-11-04 06:59:59 +00:00 2007-11-04 01:59:59 -05:00
2007-11-04 07:00:00 +00:00 2007-11-04 01:00:00 -06:00您可以通过查询v$timezone_file视图来查看您正在使用的时区数据文件的哪个版本,或者在最近的版本中查看database_properties视图。
您可以在Oracle支持文档412160.1 ( Oracle和OJVM时区文件补丁中更新的DST转换和新时区)中阅读更多有关Oracle文件版本和修补程序的信息。
特别是,请参阅J节,“RDBMS DST更新中更新的时区列表”,其中说:
所有时区文件更新都是累积的,这意味着较新的RDBMS DST修补程序具有以前更新的所有更改。 ..。 在下面的列表中,列出了时区文件版本中更新的时区。还列出了该时区时区规则更改的第一年和最后一年(如果适用的话)。
因此,它显示了历史日期也包括在内。
发布于 2018-10-16 07:45:42
来自https://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html
此表显示了(JDK)软件和TZUpdater工具的不同版本中包含了哪个版本的Timezone数据。有关时区数据发布内容的进一步信息载于该版本的相关增强请求(RFE)中。在时区数据发布中包含了一个主要的时区更改,这将在最后一列中描述。 最新的TZdata版本可以从IANA TZdata页面中找到。 自从TZUpdater v2.0发布以来,用户现在可以使用直接从IANA发行版获得的数据更新JDK/JRE中的tzdata版本。有关详细信息,请参阅TZUpdater自述文件。 如果您想了解Java平台和TZUpdater工具中的时区数据更新,请订阅时区数据版本RSS。
因此,基本上,如果您始终需要最新的时区数据,请使用TZUpdater工具升级Java时区信息。
从注释中的Alex更新
Oracle/Java将在您试图转换到特定时区的UTC日期上应用有效的适当规则。您不需要显式地做任何事情--您只需要最新版本的current+historical规则
https://stackoverflow.com/questions/52829412
复制相似问题