そのため、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"
ミリ秒ではなく秒単位である必要がありますが
もちろん!入力された入力は有効な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 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"
Jqにstrflocaltime
がある場合:
TZ=Asia/Kolkata jq -n '123|strflocaltime("%Y-%m-%dT%H:%M:%S %Z")'
"1970-01-01T05:32:03 IST"