web-dev-qa-db-fra.com

dates jq et horodatages unix

J'ai donc des données avec un tas de valeurs d'horodatage Unix (en millisecondes). Quelque chose comme ça:

{
    "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",
}

Et très souvent, nous devons rechercher des lignes dans une certaine date. Est-il possible d'interroger avec jq, en fournissant des dates lisibles par exemple 2016-04-25. Je me demande aussi si l'inverse est possible, pour que jq affiche published_at des valeurs lisibles par l'homme?

Par exemple, cela fonctionne:

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

bien que ce soit en quelques secondes, pas en millisecondes

22
iLemming

Sûr! Votre entrée fournie n'est pas JSON valide, mais je vais supposer que les virgules de fin sur ces objets sont supprimées et les objets sont enveloppés dans un tableau, qui serait l'objet racine du document JSON.

Tout d'abord, nous pouvons transformer les dates UNIX de précision à la milliseconde en seconde précision, ce que les fonctions de date de jq attendent, puis les convertir en dates lisibles par l'homme que vous attendez:

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

Ensuite, nous sélectionnons uniquement les éléments dont les dates correspondent:

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

Enfin, nous avons mis tout cela ensemble, en prenant le $date variable depuis la ligne de commande:

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 possède des fonctions d'heure et de date standard telles que strftime, comme indiqué dans le manuel en ligne. Cependant, la prise en charge de TZ est extrêmement limitée et/ou peu fiable, comme illustré ici:

$ 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

Si votre jq a strflocaltime:

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