java - Oracle 时间戳到 BST 时间的转换

标签 java oracle date timezone jodatime

我知道有很多关于时间转换的不同教程,但是这个让我非常困惑。我的任务是从 Oracle DB 读取 UTC DATE 并将其转换为 BST 时间(以更易于理解的格式)。

事实:

  • 数据库中的字段为 DATE 类型。
  • 当我执行 SELECT 查询时,它返回 2011-07-12 15:26:07 结果。
  • 我位于波兰,因此 7 月时区为 UTC+2

发生了什么:

在 Java 方面,我使用“经典”的 JDBC 连接到数据库。

当我执行 Timestamp timestampDate = resultSet.getTimestamp(COLUMN_NAME) 时,我得到结果...但是...

System.out.println(timestampDate) 打印到控制台 2011-07-12 15:26:07.0 (这与我在数据库中看到的类似)工具。

System.out.println(timestampDate.getTime()); 打印到控制台 1310477167000 (这很奇怪,因为根据 ms 迄今为止 我在网上找到的转换器,它基本上是 2011-07-12 13:26:07.0 (早 2 小时 - 这可能与该日期的波兰时区有关)

当我根据这段代码进行转换时:

ukDateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ukDateFormatter.setTimeZone(TimeZone.getTimeZone("BST")); 返回 ukDateFormatter.format(timestampDate.getTime());

我得到2011-07-12 19:26:07,我无法真正解释。

我也在尝试这个

GregorianCalendar 日历 = new GregorianCalendar(); 日历.setTime(时间戳日期); calendar.setTimeZone(TimeZone.getTimeZone("BST")); 返回 ukDateFormatter.format(calendar.getTime());

结果相同。

问题

如何以“时区无关”格式正确从 Oracle DB 读取 DATE 并将其转换为 BST?

最佳答案

这是在数据库端执行此操作的一种方法:

with dates as (select to_date('01/07/2016 10:39:29', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all
               select to_date('01/02/2016 09:18:41', 'dd/mm/yyyy hh24:mi:ss') dt from dual)
select dt,
       cast(dt AS TIMESTAMP) utc_dt_ts,
       from_tz(cast(dt AS TIMESTAMP), 'UTC') AT time zone 'Europe/London' dt_as_ts_bst,
       cast(from_tz(cast(dt AS TIMESTAMP), 'UTC') AT time zone 'Europe/London' AS DATE) dt_at_bst
from   dates;

DT                  UTC_DT_TS                                         DT_AS_TS_BST                                      DT_AT_BST
------------------- ------------------------------------------------- ------------------------------------------------- -------------------
01/07/2016 10:39:29 01-JUL-16 10.39.29.000000                         01-JUL-16 11.39.29.000000 EUROPE/LONDON           01/07/2016 11:39:29
01/02/2016 09:18:41 01-FEB-16 09.18.41.000000                         01-FEB-16 09.18.41.000000 EUROPE/LONDON           01/02/2016 09:18:41

第四列 (dt_at_bst) 显示如何获取日期并将其转换为 BST 的另一个日期。为此,它首先将日期转换为时间戳,然后告诉 Oracle 将其视为 UTC 时间戳并输出“欧洲/伦敦”区域的时间戳。像这样指定区域(而不是传递特定的 +01:00 时区)意味着生成的时间戳将支持夏令时。不建议将区域指定为三个字母的快捷方式,因为这可能代表多个区域 - 例如BST 可以是英国夏令时间或白令标准时间;两者截然不同!

我假设 BST 指的是英国夏令时间,因此我将时间戳移动到的区域指定为欧洲/伦敦。如果您需要不同的时区,则需要根据情况进行调整。

我在示例数据中包含了冬季和夏季日期,以向您展示将其转换为 BST 的效果 - 夏季时间预计会更改,而冬季时间则不会。

关于java - Oracle 时间戳到 BST 时间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41853924/

相关文章:

java - Eclipse Scout TreeView 事件处理

java - 如何使用struts2和hibernate从数据库检索实例并显示它?

java - 从自定义适配器访问ArrayList

java while 循环没有按预期工作

oracle - 在Grails/Hibernate中使用Oracle的GUID()生成的ID

oracle - Oracle查询执行时间

java - ORA-00933 : SQL command not properly ended in PreparedStatement

php - html5日期字段输入正确但输出相反

javascript - 如何在javascript中将完整日期转换为短日期?

android - 如何转换字符串数据如 2016-4-10 00 :00:00 to timestamp?