将JSON文件中的所有时间戳转换为bash中的unix时间戳(Ubuntu)

时间:2017-01-30 06:09:53

标签: json linux bash ubuntu jq

我正在尝试将文件中的所有时间戳转换为Unix时间格式,最好使用jq / bash / python。

原始格式有点奇怪:

%Y-%m-%dT%H:%M:%S.%z

GoToMeeting API的示例文件内容:

[
  {
    "Last Name": "John",
    "Subject": "Meet Now",
    "meetingId": "983329197",
    "meetingType": "immediate",
    "First Name": "Doe",
    "Conference Info": "111-222-333",
    "startdate": "2017-01-25T04:50:25.+0000",
    "enddate": "2017-01-25T05:50:25.+0000",
    "status": "INACTIVE"
  },
  {
    "Last Name": "John",
    "Subject": "dumb meeting",
    "meetingId": "569996685",
    "meetingType": "scheduled",
    "First Name": "Doe",
    "Conference Info": "111-222-333",
    "startdate": "2017-02-15T10:00:00.+0000",
    "enddate": "2017-02-15T10:30:00.+0000",
    "status": "INACTIVE"
  }
]

我能够通过运行这个来将一个单独的值转换为Unix:

输入:

jq 'strptime("%Y-%m-%dT%H:%M:%S.%z") | mktime';
"2015-03-05T04:50:25.+0000"

输出:

1425531025

这样做的主要目的是过滤掉所有早于当前时间的日期,然后将其转换为当地时间。

1 个答案:

答案 0 :(得分:1)

要解决第一个问题和主要目标,你可能想要定义一个便利功能,这里根据你的单行指定:

def convert: strptime("%Y-%m-%dT%H:%M:%S.%z") | mktime;

回答第一个问题的过滤器可以写成如下:

map( ( .startdate |= convert) | (.enddate |= convert) )

要选择感兴趣的对象,可以使用上面的def与此过滤器:

now as $now
| map( select((.startdate|convert >= $now) and (.enddate|convert >= $now)))

不幸的是,jq目前对时区的支持几乎为零,所以我不确定你将如何转换回“当地时间”。通过一些独创性和字符串操作,它可以在jq中完成,但可能不是最常用的方式。