【问题标题】:jq dates and unix timestampsjq 日期和 unix 时间戳
【发布时间】:2016-08-19 14:08:58
【问题描述】:

所以我有一个包含一堆 unix 时间戳值(以毫秒为单位)的数据。像这样的:

{
    "id": "f6922fd5-4f97-4113-820e-b45eba0ae236",
    "published_at": 1461624333859,
    "tracking_id": "a85d5ed5-5efa-461b-aae0-beb2098c0ff7",
}, {
    "id": "835d412f-5162-440c-937b-7276f22c4eb9",
    "published_at": 1461625249934,
    "tracking_id": "86472ba2-ce5f-400f-b42a-5a0ac155c42c",
}, {
    "id": "bc2efcac-67a0-4855-856a-f31ce5e4618e",
    "published_at": 1461625253393,
    "tracking_id": "c005398f-07f8-4a37-b96d-9ab019d586c2",
}

而且我们经常需要搜索特定日期内的行。是否可以使用 jq 进行查询,提供人类可读的日期,例如2016-04-25。另外我想知道是否可以反过来让 jq 以人类可读的形式显示 published_at 值?

例如这有效:

$ echo 1461624333 | jq 'todate'   
"2016-04-25T22:45:33Z"

虽然它必须以秒为单位,而不是毫秒

【问题讨论】:

    标签: json unix jq


    【解决方案1】:

    jq 1.5 具有标准的时间和日期函数,例如 strftime,如在线手册中所述。然而,对 TZ 的支持极其有限和/或不可靠,如下所示:

    $ echo $TZ
    
    $ jq -n '123 | strftime("%B %d %Y %I:%M%p %Z")'
    "January 01 1970 12:02AM EST"
    
    TZ='Asia/Kolkata' jq -n '123 | strftime("%B %d %Y %I:%M%p %Z")'
    "January 01 1970 12:02AM IST"
    

    strflocaltime

    如果你的 jq 有strflocaltime:

    TZ=Asia/Kolkata jq -n '123|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
    "1970-01-01T05:32:03 IST"
    

    【讨论】:

    【解决方案2】:

    当然!您提供的输入不是有效的 JSON,但我将假设这些对象上的尾随逗号已被删除,并且这些对象被包装在一个数组中,这将是 JSON 文档的根对象。

    首先,我们可以将毫秒精度的 UNIX 日期转换为秒精度,这是 jq 的日期函数所期望的,然后将其转换为您期望的人类可读的日期:

    .[].published_at |= (. / 1000 | strftime("%Y-%m-%d"))
    

    然后,我们只选择那些日期匹配的元素:

    map(select(.published_at == $date))
    

    最后,我们将它们放在一起,从命令行获取 $date 变量:

    jq --arg date "2016-04-25" '.[].published_at |= (. / 1000 | strftime("%Y-%m-%d")) | map(select(.published_at == $date))' stuff.json
    

    【讨论】:

    • 很好的答案。我最终将它用于我的时间字段:jq '.features[].properties.Time |= (. / 1000 | strftime("%Y-%m-%d %H:%M UTC"))'
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多