【问题标题】:Timestamp string conversion / from_utc_timestamp时间戳字符串转换/from_utc_timestamp
【发布时间】:2022-01-21 12:47:04
【问题描述】:

我需要将 2021-10-03 15:10:00.0 转换为 2021-10-03T15:10:00-04:00

我试过了。

from_utc_timestamp(from_unixtime(unix_timestamp('2021-10-03 15:10:00.0', "yyyy-MM-dd HH:mm:ss.S"),"yyyy-MM-dd'T'HH:mm:ssXXX"),"America/New_York") 

我得到了 Null 值

大家有什么建议

【问题讨论】:

    标签: sql hive timestamp hql hiveql


    【解决方案1】:
    1. from_utc_timestamp 可以接受时间戳或兼容字符串 (yyyy-MM-dd HH:mm:ss.S),或 bigint,而不是这个:"yyyy-MM-dd'T'HH:mm:ssXXX"

    2. Hive 时间戳是无时区的。一旦你从 UTC 转换为 America/NY,时区信息就会丢失,只有你知道它在哪个时区,转换时间戳已经不可能从中得出时区。

    3. 您可以与时区连接,这样的转换会返回您需要的内容,但它仅适用于特定日期。 12 月 -05:00 时区应使用而不是 +04:00:

      date_format(from_utc_timestamp('2021-10-03 15:10:00.0',"America/New_York"),"yyyy-MM-dd'T'HH:mm:ss+04:00") --This is wrong!!!

    From_utc_timestamp 支持夏令时。它可以是 -05:00 或 -04:00,具体取决于日期。

    考虑这个例子,第一个返回 5,第二个返回 4:

    select (unix_timestamp("2020-01-01 12:00:00.0")-unix_timestamp(from_utc_timestamp("2020-01-01 12:00:00.0","America/New_York")))/60/60
    
    select (unix_timestamp("2020-10-19 12:00:00.0")-unix_timestamp(from_utc_timestamp("2020-10-19 12:00:00.0","America/New_York")))/60/60
    

    因此,您可以获取与 America/New_York 对应的相同时间戳的当前时区,并将其与转换后的时间戳连接:

    select concat(date_format(from_utc_timestamp('2021-10-03 15:10:00.0',"America/New_York"),"yyyy-MM-dd'T'HH:mm:ss"),'+0',
                  --get hrs shift 
                  (unix_timestamp("2021-10-03 15:10:00.0")-unix_timestamp(from_utc_timestamp("2021-10-03 15:10:00.0","America/New_York"))) div 3600,':00')
    

    结果:

    2021-10-03T11:10:00+04:00
    

    考虑到美国/纽约的夏令时,它应该可以在不同的时间戳下正常工作。

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多