如何使用jq-1.6将UTC时间转换为AEDT本地夏令时
解决jq-1.6 UTC转澳大利亚东部夏令时(AEDT)的问题
问题原因分析
1. fromdate | todate返回错误UTC时间的原因
jq 1.6的fromdate函数对带Z标识的ISO 8601字符串解析存在缺陷——它没有正确识别Z代表UTC,反而将字符串视为本地时区时间来解析,再转换为UTC时间戳,最终用todate转回UTC字符串时就出现了1小时偏移。
2. fromdate | localtime | todate结果错误的原因
localtime的作用是把UTC时间戳转换为本地时区的时间数组(而非时间戳),而todate仅能接受Unix时间戳并输出UTC格式字符串。直接将localtime返回的数组传给todate,会导致jq把数组当成数字处理,从而生成完全错误的时间。
正确解决方案
核心命令
使用fromdateiso8601(严格解析ISO 8601带时区的字符串)替代fromdate,搭配strftime(自定义本地时间格式)来输出AEDT时间:
echo '"2023-10-19T04:59:59Z"' | jq 'fromdateiso8601 | localtime | strftime("%Y-%m-%dT%H:%M:%S %Z")'
执行后会输出正确结果:
"2023-10-19T15:59:59 AEDT"
命令步骤拆解
fromdateiso8601:严格解析带Z的UTC字符串为正确的Unix时间戳,不受本地时区干扰。localtime:将UTC时间戳转换为本地时区(AEDT)的时间数组,自动识别夏令时。strftime("%Y-%m-%dT%H:%M:%S %Z"):将时间数组格式化为包含时区标识的字符串,可根据需求修改格式参数(比如去掉%Z就只输出时间部分)。
强制指定时区(可选)
如果系统默认时区不是澳大利亚东部时区,可临时设置TZ环境变量确保转换正确:
TZ="Australia/Sydney" echo '"2023-10-19T04:59:59Z"' | jq 'fromdateiso8601 | localtime | strftime("%Y-%m-%dT%H:%M:%S %Z")'
内容的提问来源于stack exchange,提问作者surz
相关产品推荐
相关产品推荐

