从Oracle JDBC TIMEZONETZ对象中提取时区

时间:2009-05-22 06:54:41

标签: sql oracle datetime jdbc timezone

有没有办法直接从oracle.sql.TIMESTAMPTZ对象(从TIMESTAMP WITH TIME ZONE列中选择)提取时区信息?

理想情况下,我希望能够直接从对象中提取时区信息,而不会跳过可能昂贵或脆弱的环节(比如将事物转换为字符串并解析它们)。

你会认为有一种简单的方法可以做到这一点,但我还没有找到一个。 Oracle的文档不是很有帮助。它声称TIMESTAMPTZ#toBytes()返回的最后两个字节对时区信息进行编码,但没有描述我们实际解码此信息。

那里的任何人都有处理这些东西的经验吗?

2 个答案:

答案 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的影响。