时间戳字符串转换/from_utc_timestamp

Timestamp string conversion / from_utc_timestamp

我需要将 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 值

有什么建议吗

  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. 您可以与时区连接,像这样的转换 returns 您需要什么,但它仅适用于特定日期。 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,具体取决于日期。

考虑这个例子,第一个returns 5,第二个returns 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

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