时间戳字符串转换/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 值
有什么建议吗
from_utc_timestamp 可以接受时间戳或兼容字符串 (yyyy-MM-dd HH:mm:ss.S
),或 bigint,而不是这个:"yyyy-MM-dd'T'HH:mm:ssXXX"
Hive 时间戳是无时区的。一旦你从 UTC 转换为 America/NY,时区信息丢失,只有你知道它在哪个时区,转换时间戳已经不可能从中推导出时区。
您可以与时区连接,像这样的转换 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 的夏令时,它应该可以在不同的时间戳下正常工作。
我需要将 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 值
有什么建议吗
from_utc_timestamp 可以接受时间戳或兼容字符串 (
yyyy-MM-dd HH:mm:ss.S
),或 bigint,而不是这个:"yyyy-MM-dd'T'HH:mm:ssXXX"
Hive 时间戳是无时区的。一旦你从 UTC 转换为 America/NY,时区信息丢失,只有你知道它在哪个时区,转换时间戳已经不可能从中推导出时区。
您可以与时区连接,像这样的转换 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 的夏令时,它应该可以在不同的时间戳下正常工作。