【问题标题】:Date Conversion of one Timezone to different timezone一个时区到不同时区的日期转换
【发布时间】:2015-07-31 06:50:46
【问题描述】:

我有个约会说2011-09-26T21:00:00Z。我不确定日期中的TZ 是什么意思。这是EET 时间。我需要将其转换为当地时间 'IST'。

预期的 O/P :2011-09-27T00:30:00Z(因为我们有 3 小时 30 分钟的 B/w EET 和 IST 差异。即使 2011-09-27 00:30:002011-09-27(至少)对我来说也可以。

我正在尝试以下查询,但出现TimeZone region not found 错误

select to_char((from_tz(to_timestamp(to_char('2011-09-26T21:00:00Z','YYYY-MM-DD HH24:MI:SS') 
                                           ,'YYYY-MM-DD HH:MI:SS PM') ,'EET')
       at time zone 'IST'),'YYYY-MM-DD HH:MI:SS PM TZD') as localtime
       from dual;

请有人建议任何其他转换方式。

更新: 我已经尝试了以下查询。它正在输出。但这不是我们想要的格式。

select TO_TIMESTAMP_TZ(TO_CHAR((to_timestamp('2011-09-26 21:00:00','yyyy/mm/dd hh24:mi:ss')),
                      'yyyy/mm/dd hh24:mi:ss')||' Europe/Berlin',
                      'yyyy/mm/dd hh24:mi:ss tzr') AT TIME ZONE 'Asia/Calcutta' ts_eet 
          from dual;

输出27-SEP-11 12.30.00.000000000 AM ASIA/CALCUTTA。这里我有一个问题 1) 我不想在一个月内使用SEP 而我只需要09 并且格式应该与2011-09-27 相同

【问题讨论】:

  • 九月的日期不会是 EEST 而不是 EET (in most places)?您是否有可以分配给源时间戳的区域,而不是 EET?但是字符串中的“Z”应该意味着它是a UTC time,所以已经有问题了......
  • 我已经用地区更新了最新的查询。现在我得到了输出,但不是所需的格式,你能说一下如何转换吗?

标签: oracle date oracle11g


【解决方案1】:

Oracle 将 EET 视为时区区域名称(SELECT tzname, tzabbrev FROM V$TIMEZONE_NAMES WHERE tzname = 'EET',或参见the docs),因此它处理夏令时/夏令时 (EEST/EEDT)。在 2011-09-26 EET region was actually EEST 所以它比 UTC 早了三个小时,而不是两个小时;由于 IST 始终为 +05:30,因此偏移量实际上为 +02:30。所以你的结果是“正确的”。

您可以使用from_tz 函数将普通时间戳更改为带时区的时间戳,而不是来回跳转到字符串;然后at time zone 在不同的区域获得它:

select to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') orig_ts,
  from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
    'EET') orig_tsz,
  sys_extract_utc(from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
    'EET')) orig_utc,
  from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
    'EET') at time zone 'Asia/Calcutta' new_tsz
from dual;

ORIG_TS             ORIG_TSZ                          ORIG_UTC            NEW_TSZ                         
------------------- -------------------------- ------------------- ---------------------------------
2011-09-26 21:00:00 2011-09-26 21:00:00 EET    2011-09-26 18:00:00 2011-09-26 23:30:00 ASIA/CALCUTTA

原始字符串中的“T”表示时间,“Z”表示(或应该!)这表示 UTC 中的日期/时间;这是the ISO 8601 standard notation。 Oracle 的转换功能允许您embed character literals in the format model 忽略这些。由于它有一个“Z”,因此您应该将其视为 UTC 而不是 EET,因此您可能希望返回到您从中获取这些值的任何人。

如果您确实希望所有值都来自没有夏令时偏移的 EET 时区,那么您可以使用固定的 TZH:TZM 而不是区域名称:

select to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') orig_ts,
  from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
    '+02:00') orig_tsz,
  sys_extract_utc(from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
    '+02:00')) orig_utc,
  from_tz(to_timestamp('2011-09-26T21:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'),
    '+02:00') at time zone 'Asia/Calcutta' new_tsz
from dual;

ORIG_TS             ORIG_TSZ                          ORIG_UTC            NEW_TSZ                         
------------------- -------------------------- ------------------- ---------------------------------
2011-09-26 21:00:00 2011-09-26 21:00:00 +02:00 2011-09-26 19:00:00 2011-09-27 00:30:00 ASIA/CALCUTTA

我怀疑这实际上是你想要的,但你需要澄清你的要求。

最后要将转换后的值恢复为原始格式,您需要使用to_char

select to_char(from_tz(to_timestamp('2011-09-26T21:00:00Z',
    'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'EET') at time zone 'Asia/Calcutta',
    'YYYY-MM-DD HH24:MI:SS') new_string
from dual;

NEW_STRING        
-------------------
2011-09-26 23:30:00

您可以使用'YYYY-MM-DD"T"HH24:MI:SS' 重新嵌入“T”;不过,将“Z”重新添加到末尾似乎是错误的。

如果您的源时间来自柏林,正如您的问题编辑所建议的那样(这是 CET/CEST,而不是 EET/EEST;为您赢得那个缺失的时间)只需更改 from_tz 区域:

select to_char(from_tz(to_timestamp('2011-09-26T21:00:00Z',
    'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'Europe/Berlin') at time zone 'Asia/Calcutta',
    'YYYY-MM-DD"T"HH24:MI:SS') new_string
from dual;

NEW_STRING        
-------------------
2011-09-27T00:30:00

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2019-08-23
    • 2019-09-07
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2015-02-21
    相关资源
    最近更新 更多