jq日期和unix时间戳

iLe*_*ing 23 unix json jq

所以我有一堆带有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",
}
Run Code Online (Sandbox Code Playgroud)

而且我们经常需要在特定日期内搜索行.是否可以使用jq查询,提供人类可读日期,例如2016-04-25.另外我想知道是否可能采用其他方式,使jq published_at以人类可读的形式显示值?

例如,这有效:

$ echo 1461624333 | jq 'todate'   
"2016-04-25T22:45:33Z"
Run Code Online (Sandbox Code Playgroud)

虽然它必须在几秒钟内,而不是几毫秒

小智 26

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

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

.[].published_at |= (. / 1000 | strftime("%Y-%m-%d"))
Run Code Online (Sandbox Code Playgroud)

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

map(select(.published_at == $date))
Run Code Online (Sandbox Code Playgroud)

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

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


pea*_*eak 14

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"
Run Code Online (Sandbox Code Playgroud)

strflocaltime

如果你的jq有strflocaltime:

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