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

如何使用jq 1.6将日期转换为毫秒级时间戳

使用jq 1.6将带毫秒的ISO日期转换为毫秒级时间戳

需求场景

输入文件file1.json内容:

{
    "horodate" : "2023-03-03T10:10:10.425Z"
}

需将horodate字段转换为毫秒精度的字符串类型时间戳,目标输出file2.json:

{
    "horodate" : "1677838210425"
}

现有尝试的问题

你尝试的两个命令存在以下问题:

  • 第一个命令:strptime的格式符错误,%s是时间戳占位符而非毫秒格式符,且输入是单个JSON对象,无需用[.[]]数组遍历语法。
  • 第二个命令:正则表达式中.未转义(需写成\.),毫秒部分的截取逻辑不够健壮,同样不需要数组遍历语法。

正确解决方案

方法一:利用fromdateiso8601(推荐)

jq 1.6原生支持fromdateiso8601函数,可直接解析带毫秒的ISO8601日期,返回带小数的秒级时间戳,处理步骤如下:

jq '.horodate |= (fromdateiso8601 * 1000 | floor | tostring)' file1.json > file2.json
  • fromdateiso8601:解析带毫秒的ISO日期,得到如1677838210.425的数值
  • * 1000:转换为毫秒级数值
  • floor:取整去除小数部分
  • tostring:将数值转为字符串类型,匹配目标输出格式

方法二:修正字符串拆分逻辑

如果需要手动拆分日期部分和毫秒部分,可使用以下命令:

jq '.horodate |= (
    (sub("\.[0-9]+Z$"; "Z") | fromdate) * 1000 
    + (split(".")[1] | split("Z")[0] | tonumber)
    | tostring
)' file1.json > file2.json
  • sub("\.[0-9]+Z$"; "Z"):移除毫秒部分,得到2023-03-03T10:10:10Z
  • fromdate:将处理后的日期转为秒级时间戳
  • split(".")[1] | split("Z")[0]:拆分出毫秒数字425
  • 两部分计算后转字符串得到目标结果

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:35:21