2016-04-26 3 views
6

Итак, у меня есть данные с букетом значений временной отметки unix (в миллисекундах). Что-то вроде этого:даты jq и временные метки 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 показать значения published_at в форме, удобочитаемой человеком?

Например, это работает:

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

хотя это должно быть в секундах, а не миллисекунды

ответ

4

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

Обязательно! Ваш предоставленный ввод недействителен 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 
+0

отличный ответ. Я закончил использовать это для своего поля Time: 'jq '.features []. Properties.Time | = (./1000 | strftime («% Y-% m-% d% H:% M UTC »))' ' –

Смежные вопросы