将链式输入传递给strftime:Dynamo表数据jq解析及C# ticks转日期问题
解决C# Ticks转常规日期时间的jq方案
我之前也踩过这个坑!C# ticks的时间基准和jq默认用的Unix时间戳完全不一样,直接转肯定出问题,我给你梳理一下具体的解决方法:
首先得明确核心差异:
- C# Ticks:从UTC时间
0001-01-01 00:00:00开始,每100纳秒算1个tick(1秒=10,000,000 ticks) - Unix时间戳:从UTC时间
1970-01-01 00:00:00开始,以秒或毫秒为单位
两者之间的固定偏移量是621355968000000000 ticks——也就是从0001年到1970年的总tick数,这是转换的关键。
基础转换示例
假设你的JSON数据里,ticks字段叫eventTicks,直接用jq转换的命令如下:
jq '.eventTime = ((.eventTicks - 621355968000000000) / 10000000 | fromdate | strftime("%Y-%m-%d %H:%M:%S UTC"))' your-data.json
拆解一下每个部分:
(.eventTicks - 621355968000000000):把C# ticks的基准偏移到Unix时间的基准/ 10000000:将ticks转换为秒(因为1秒=10^7 ticks)fromdate:把秒数转成jq的内部日期对象strftime("%Y-%m-%d %H:%M:%S UTC"):格式化成你需要的可读日期字符串(可以根据需求调整格式,比如"%Y-%m-%dT%H:%M:%SZ"符合ISO8601)
适配DynamoDB输出的场景
如果是从DynamoDB导出的数据,数字字段会以{"N": "xxx"}的结构存储,需要先把字符串转成数字:
# 比如用aws cli扫表后直接处理 aws dynamodb scan --table-name YourTable | jq '.Items[] |= ( .eventTicks = (.eventTicks.N | tonumber) | .eventTime = ((.eventTicks - 621355968000000000) / 10000000 | fromdate | strftime("%Y-%m-%d %H:%M:%S UTC")) )'
可选:保留毫秒精度
如果你的ticks包含毫秒级精度,可以转成毫秒再处理:
jq '.eventTime = ((.eventTicks - 621355968000000000) / 10000 | fromdateiso8601 | strftime("%Y-%m-%d %H:%M:%S.%3f UTC"))' your-data.json
这里/10000是把ticks转成毫秒,%3f用来显示三位毫秒数。
时区转换
如果需要转成本地时间,把strftime换成strflocaltime即可,比如:
jq '.eventTime = ((.eventTicks - 621355968000000000) / 10000000 | fromdate | strflocaltime("%Y-%m-%d %H:%M:%S %Z"))' your-data.json
内容的提问来源于stack exchange,提问作者eagle
相关产品推荐
相关产品推荐

