2016-04-26 196 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

很好的答案。我最終使用這個我的時間字段: 'jq'.features []。properties.Time | =(。/ 1000 | strftime(「%Y-%m-%d%H:%M UTC」))'' ' –