Presto中如何调整YYYY-MM-DD'T'HH:mm:ss.SSSZ格式时间戳的时区偏移?
Presto 带时区偏移时间戳转换实现方案
你需要的带时差调整的时间格式转换,可以按「解析带时区的时间值 -> 统一转换到目标时区 -> 按指定格式输出」的流程实现,针对你给出的样例,最终可得到目标结果2022-05-25T17:31:22.566的代码如下:
SELECT substr( date_format( -- 解析ISO格式带偏移的时间字符串,转换为UTC时区时间 from_iso8601_timestamp('2022-05-25T13:31:22.566-0400') AT TIME ZONE 'UTC', '%Y-%m-%dT%H:%i:%s.%f' ), 1, 23) AS converted_ts;
函数逻辑说明
from_iso8601_timestamp():Presto内置的ISO 8601格式时间解析函数,可自动识别你传入字符串末尾的-0400西4区偏移量,返回带时区信息的时间戳类型,不需要手动编写复杂的字符串解析规则。AT TIME ZONE 'UTC':将带时区信息的时间戳转换到UTC时区,自动完成时差计算:西4区的2022-05-25 13:31:22.566,和UTC时差为4小时,转换后自动加4小时得到UTC时间2022-05-25 17:31:22.566。如果后续需要转换到其他时区(比如东八区),只需将参数替换为对应时区ID即可,例如'Asia/Shanghai'。date_format():按照指定格式将时间类型转为字符串,格式串中%Y-%m-%dT%H:%i:%s对应你要求的年-月-日T时:分:秒结构,追加的.%f用来匹配毫秒位。substr(...,1,23):因为%f默认输出6位微秒值,截取前23位即可保留3位毫秒,和你给出的样例输出格式完全一致;如果不需要保留毫秒,直接去掉.%f和substr逻辑,格式串用'%Y-%m-%dT%H:%i:%s'即可。
注意:不要直接使用
date_parse硬解析带时区偏移的字符串,该函数不会自动识别时区偏移做时差换算,很容易出现时间计算错误,优先使用ISO格式专用解析函数处理这类时间字符串。
内容的提问来源于stack exchange,提问作者Hao Xu
相关产品推荐
相关产品推荐

