2016-04-26 17 views
6

Quindi ho un dato con una serie di valori di timestamp unix (in millisecondi). Qualcosa del genere:jq date e unix timestamp

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

E molto spesso è necessario cercare le righe entro una certa data. È possibile interrogare con jq, fornendo date leggibili dall'uomo, ad es. 2016-04-25. Inoltre mi chiedo se il contrario possibile, per rendere jq mostrano i valori published_at in forma leggibile dall'uomo?

Per esempio, questo funziona:

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

anche se deve essere in pochi secondi, non millisecondi

risposta

4

JQ 1.5 ha funzioni standard time-and-date, come strftime, come documentato nel manuale online . Tuttavia il supporto per TZ è estremamente limitata e/o inaffidabili, come illustrato qui:

$ 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" 
7

Certo! Il tuo input fornito non è JSON valido, ma assumerò che le virgole finali su quegli oggetti vengano rimosse e che gli oggetti siano avvolti in un array, che sarebbe l'oggetto root del documento JSON.

In primo luogo, siamo in grado di trasformare il millisecondo-precisione risale UNIX al secondo-precisione, che è ciò di JQ funzioni di data si aspettano, e quindi convertire che alle date leggibili che ci si aspetta:

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

Poi, selezioniamo solo quegli elementi i cui impegni corrispondano:

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

Infine, abbiamo messo tutto insieme, prendendo la variabile $date dalla riga di comando:

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

ottima risposta. Ho finito per usare questo per il mio campo Time: 'jq '.features []. Properties.Time | = (./1000 | strftime ("% Y-% m-% d% H:% M UTC "))' ' –