我知道有很多关于时间转换的不同教程,但是这个让我非常困惑。我的任务是从 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/