有没有办法直接从oracle.sql.TIMESTAMPTZ
对象(从TIMESTAMP WITH TIME ZONE
列中选择)提取时区信息?
理想情况下,我希望能够直接从对象中提取时区信息,而不会跳过可能昂贵或脆弱的环节(比如将事物转换为字符串并解析它们)。
你会认为有一种简单的方法可以做到这一点,但我还没有找到一个。 Oracle的文档不是很有帮助。它声称TIMESTAMPTZ#toBytes()
返回的最后两个字节对时区信息进行编码,但没有描述我们实际解码此信息。
那里的任何人都有处理这些东西的经验吗?
答案 0 :(得分:1)
Oracle具有以下特定日期格式元素:TZD,TZH,TZM和TZR。
一个例子:
SQL> create table t (col timestamp with time zone)
2 /
Tabel is aangemaakt.
SQL> insert into t values (sysdate)
2 /
1 rij is aangemaakt.
SQL> select col
2 , to_char(col,'TZD') time_zone_daylight_info
3 , to_char(col,'TZH') time_zone_hour
4 , to_char(col,'TZM') time_zone_minute
5 , to_char(col,'TZR') time_zone_region
6 from t
7 /
COL TIME_Z TIM TI TIME_ZONE_REGION
------------------------------- ------ --- -- --------------------------------
22-05-09 09:12:33,000000 +02:00 +02 00 +02:00
1 rij is geselecteerd.
或使用EXTRACT功能:
SQL> select col
2 , extract(timezone_abbr from col) time_zone_abbr
3 , extract(timezone_hour from col) time_zone_hour
4 , extract(timezone_minute from col) time_zone_minute
5 , extract(timezone_region from col) time_zone_region
6 from t
7 /
COL TIME_ZONE_ TIME_ZONE_HOUR TIME_ZONE_MINUTE
------------------------------- ---------- -------------------------------------- --------------------------------------
TIME_ZONE_REGION
----------------------------------------------------------------
22-05-09 09:15:24,000000 +02:00 UNK 2 0
UNKNOWN
1 rij is geselecteerd.
答案 1 :(得分:0)
TIMESTAMPTZ的格式为well documented。我们目前使用the following code来提取时区信息。
如果您使用的是Java SE 8,则可以使用getObject(int, OffsetDateTime.class)
,如果您使用getObject(int, ZonedDateTime.class)
,则可能会受到bug 25792016的影响。