如何用jq批量更新JSON文件中的日期(含增量计算与替换)
JSON日期批量更新脚本(GitLab流水线兼容)
核心需求
- 提取
metadata.modelrun_utc的原日期,替换为当日UTC日期,同时计算原时间与当日基准时间(00:00:00 UTC)的秒级时间差delta - 将
metadata.modelrun_updatetime_utc的日期部分替换为当日UTC日期,保留原时间部分不变 - 给
data_1h.time数组中的所有时间字符串加上delta秒,生成新的ISO格式时间
输入JSON示例
{ "metadata": { "modelrun_utc": "2024-05-20T00:00:00Z", "modelrun_updatetime_utc": "2024-05-20T12:34:56Z" }, "data_1h": { "time": [ "2024-05-20T01:00:00Z", "2024-05-20T02:00:00Z", "2024-05-20T03:00:00Z" ] } }
可执行Shell脚本
#!/bin/bash # 确保jq已安装(根据GitLab runner镜像调整安装命令) # Debian/Ubuntu 环境: # apt-get update && apt-get install -y jq # Alpine 环境: # apk add --no-cache jq # 获取当日UTC日期(YYYY-MM-DD)及基准时间(00:00:00 UTC) TODAY_UTC=$(date -u +%Y-%m-%d) TODAY_BASE="${TODAY_UTC}T00:00:00Z" # 处理JSON文件:input.json为源文件,output.json为输出文件 jq --arg today_base "$TODAY_BASE" --arg today_utc "$TODAY_UTC" ' # 计算时间差delta(秒):当日基准时间 - 原modelrun_utc时间 ($today_base | fromdateiso8601) - (.metadata.modelrun_utc | fromdateiso8601) as $delta # 更新modelrun_utc为当日基准时间 | .metadata.modelrun_utc = $today_base # 替换modelrun_updatetime_utc的日期部分,保留原时间 | .metadata.modelrun_updatetime_utc = ($today_utc + (.metadata.modelrun_updatetime_utc | split("T")[1])) # 批量更新data_1h.time数组的每个时间 | .data_1h.time |= map( (fromdateiso8601 + $delta) | todateiso8601 ) ' input.json > output.json
期望输出示例(当日为2024-06-10时)
{ "metadata": { "modelrun_utc": "2024-06-10T00:00:00Z", "modelrun_updatetime_utc": "2024-06-10T12:34:56Z" }, "data_1h": { "time": [ "2024-06-10T01:00:00Z", "2024-06-10T02:00:00Z", "2024-06-10T03:00:00Z" ] } }
关键细节说明
- 用
date -u获取UTC日期,避免GitLab流水线时区差异导致的日期错误 - jq的
fromdateiso8601/todateiso8601负责ISO时间与时间戳的互转,确保时间计算准确 - 分割
modelrun_updatetime_utc提取时间部分的逻辑,兼容所有标准ISO格式时间字符串 - 数组批量更新用
map()实现,高效处理任意长度的时间数组
内容的提问来源于stack exchange,提问作者EricBDev
相关产品推荐
相关产品推荐

