web-dev-qa-db-ja.com

jq日付とUNIXタイムスタンプ

そのため、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 show published_at人間が読める形式の値?

たとえば、これは動作します:

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

ミリ秒ではなく秒単位である必要がありますが

22
iLemming

もちろん!入力された入力は有効な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
26
user3899165

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"
14
peak