如何将MM/DD/YYYY HH:MM:SS AM/PM转换为ISO日期格式YYYY-MM-DDThh:mm:ssZ
解决MM/DD/YYYY HH:MM:SS AM/PM转ISO标准日期格式的问题
别担心,这个日期格式转换其实只要把函数参数和时区处理对就搞定了!你之前用unix_timestamp没成功,大概率是格式模板或者时区转换没做对,我给你分场景讲清楚:
场景1:Spark SQL环境
Spark的日期函数比较直观,咱们分三步来:
- 用
to_timestamp解析原字符串,指定匹配的格式模板 - 转成UTC时区(因为ISO格式的
Z代表UTC时间) - 用
date_format输出标准ISO格式
示例代码:
SELECT date_format( to_utc_timestamp( to_timestamp('01/23/2020 11:37:23 PM', 'MM/dd/yyyy hh:mm:ss a'), 'UTC' ), 'yyyy-MM-dd''T''HH:mm:ss''Z''' ) AS iso_utc_date;
关键细节:
- 格式模板里的
MM是月份(别写成mm,那是分钟),hh是12小时制,a用来匹配AM/PM标识 to_utc_timestamp负责把原时间转成UTC,确保输出的Z符合标准- 格式化时用单引号包裹
T和Z,避免被解析为格式占位符
执行后,输入01/23/2020 11:37:23 PM(假设原时间是美国东部时区)会输出2020-01-24T03:37:23Z,完全符合ISO标准。
场景2:Hive SQL环境
Hive的函数逻辑略有不同,你可以结合unix_timestamp和时区转换来实现:
-- 先确保时区设置正确,或者用convert_tz指定时区 SET hive.timezone=UTC; SELECT concat( from_unixtime(unix_timestamp('01/23/2020 11:37:23 PM', 'MM/dd/yyyy hh:mm:ss a'), 'yyyy-MM-dd'), 'T', from_unixtime(unix_timestamp('01/23/2020 11:37:23 PM', 'MM/dd/yyyy hh:mm:ss a'), 'HH:mm:ss'), 'Z' ) AS iso_utc_date;
如果原时间不是UTC时区,推荐用convert_tz明确转换:
SELECT date_format( convert_tz( to_timestamp('01/23/2020 11:37:23 PM', 'MM/dd/yyyy hh:mm:ss a'), 'America/New_York', -- 替换成你的原时间时区 'UTC' ), 'yyyy-MM-dd''T''HH:mm:ss''Z''' ) AS iso_utc_date;
常见坑点提醒
- 千万别搞混
MM(月份)和mm(分钟)、hh(12小时制)和HH(24小时制),这是最容易出错的地方 - ISO格式的
Z必须对应UTC时间,所以一定要做时区转换,不然结果会不符合标准 - 大多数SQL日期函数对AM/PM的大小写不敏感,所以不用特意匹配大小写
内容的提问来源于stack exchange,提问作者Sanket Jain
相关产品推荐
相关产品推荐

