如何用JQ将New Relic API返回的时间戳转换为可读日期?
最优解决方案:用JQ直接转换(无需sed)
你的问题核心是毫秒级时间戳转日期格式,JQ完全可以搞定,之前没成功大概率是没处理毫秒转秒的步骤,或者用错了函数。
方法1:JQ内置函数(需JQ 1.6+)
New Relic返回的是13位毫秒时间戳,而JQ的strflocaltime默认接受10位秒级时间戳,所以先把字符串转成数字后除以1000,再格式化:
.timestamp | tonumber / 1000 | strflocaltime("%Y-%m-%d")
测试示例:
输入JSON:
{"timestamp": "1696358217197"}
执行命令:
echo '{"timestamp": "1696358217197"}' | jq '.timestamp | tonumber / 1000 | strflocaltime("%Y-%m-%d")'
输出:"2023-10-02"
方法2:结合系统date命令(兼容旧版JQ)
如果你的JQ版本低于1.6,没有strflocaltime,可以用JQ提取时间戳后传给date命令处理:
echo '{"timestamp": "1696358217197"}' | jq -r '.timestamp' | xargs -I {} date -d @$(({} / 1000)) +%Y-%m-%d
解释:
jq -r输出原始字符串(不带引号)xargs -I {}把时间戳传给date命令$(({} / 1000))把毫秒转成秒date -d @<秒级时间戳>解析时间,+%Y-%m-%d指定输出格式
为什么不推荐sed?
sed擅长文本替换,但不擅长数值计算和日期解析,要靠sed实现时间戳转日期需要写极其复杂的正则和计算逻辑,完全没必要,用JQ或JQ+date的方案更简洁、易维护。
内容的提问来源于stack exchange,提问作者Rafael Umbelino
相关产品推荐
相关产品推荐

