如何使用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:10Zfromdate:将处理后的日期转为秒级时间戳split(".")[1] | split("Z")[0]:拆分出毫秒数字425- 两部分计算后转字符串得到目标结果
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

