You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:23:42