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

将链式输入传递给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:56:51