Vraag jq datums en unix tijdstempels


Dus ik heb data met een heleboel Unix timestamp-waarden (in milliseconden). Iets zoals dit:

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

En heel vaak moeten we rijen zoeken binnen een bepaalde datum. Is het mogelijk om met jq te zoeken, door mensen leesbare datums te leveren, bijvoorbeeld 2016-04-25. Ook vraag ik me af of het andersom mogelijk is, om jq show te maken published_at waarden in menselijke leesbare vorm?

Dit werkt bijvoorbeeld:

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

hoewel het in seconden moet zijn, niet milliseconden


12
2018-04-26 00:07


oorsprong


antwoorden:


Zeker! De door u opgegeven invoer is geen geldige JSON, maar ik ga ervan uit dat de volgende komma's op die objecten worden verwijderd en de objecten in een array worden gewikkeld, wat het basisobject van het JSON-document zou zijn.

Ten eerste kunnen we de milliseconde-precisie UNIX-datums omzetten in een tweede precisie, wat de datafuncties van jq verwachten, en dat vervolgens converteren naar de door mensen leesbare datums die u verwacht:

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

Vervolgens selecteren we alleen die elementen waarvan de datums overeenkomen:

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

Ten slotte hebben we alles samengevoegd en de $date variabele van de opdrachtregel:

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

12
2018-04-26 17:48



jq 1.5 heeft standaard tijd-en-datumfuncties zoals strftime, zoals gedocumenteerd in de online handleiding. Ondersteuning voor TZ is echter uiterst beperkt en / of onbetrouwbaar, zoals hier wordt geïllustreerd:

$ 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

Als je jq heeft strflocaltime:

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

9
2018-04-26 00:21