使用Strptime、时区及jq时遇问题,期望输出2018-03-13 14:00:17
嘿,我来帮你排查下这个问题!结合strptime和jq处理时区时踩坑太常见了,我猜大概率是时区解析或者转换环节出了问题,咱们一步步来捋:
1. 先确认输入时间的时区格式是否匹配strptime指令
jq的strptime函数必须对应输入时间里的时区标识来写指令,不然它会直接忽略时区信息,结果自然不对。比如你的输入如果是带时区偏移的(像2018-03-13T10:00:17-0400),就得用%z这个指令来解析那串-0400的偏移,不然时区等于白给。
举个能得到你期望输出2018-03-13 14:00:17的正确例子:
假设你原始时间是"2018-03-13T10:00:17-0400"(UTC-4时区的时间),要转成UTC时间,命令应该是:
"2018-03-13T10:00:17-0400" | strptime("%Y-%m-%dT%H:%M:%S%z") | mktime | strftime("%Y-%m-%d %H:%M:%S")
这里的关键步骤:
- 用
%z精准匹配输入的时区偏移 - 靠
mktime把解析后的时间结构体转成UTC时间戳(自动处理时区偏移) - 最后用
strftime输出你要的YYYY-MM-DD HH:MM:SS格式
2. 别混淆本地时区和UTC
如果你的输入本身就是UTC时间(比如带Z后缀的"2018-03-13T14:00:17Z"),但你解析时没明确处理,jq可能会默认用系统本地时区来转换,结果就会偏移。这时候要确保strptime能识别UTC标识:
修正后的命令:
"2018-03-13T14:00:17Z" | strptime("%Y-%m-%dT%H:%M:%SZ") | mktime | strftime("%Y-%m-%d %H:%M:%S")
这里的Z是UTC的标准标识,strptime能直接识别,mktime会把它当作UTC时间处理,输出就是你想要的结果。
3. 先验证解析后的时间结构体是否正确
如果还是不对,你可以先把strptime解析后的结果打出来看看,确认时区字段有没有被正确解析。比如执行:
"2018-03-13T10:00:17-0400" | strptime("%Y-%m-%dT%H:%M:%S%z")
正常输出里应该包含"offset": -14400(对应-0400的秒数),如果这个字段缺失,说明你的strptime指令没匹配到时区部分,得重新调整指令和输入格式的对应关系。
4. 检查jq版本的兼容性
旧版本的jq对%z指令的支持有限,比如有些老版本只认±HH:MM格式的时区偏移(比如-04:00),不认±HHMM(-0400)。如果你的jq版本比较老,要么升级到最新稳定版,要么把输入的时区格式改成-04:00再试:
"2018-03-13T10:00:17-04:00" | strptime("%Y-%m-%dT%H:%M:%S%z") | mktime | strftime("%Y-%m-%d %H:%M:%S")
要是以上方法都没解决,你可以把你实际用的jq命令和输入的时间字符串贴出来,我帮你精准定位问题!
内容的提问来源于stack exchange,提问作者eagle

