【问题标题】:reformat Timestamp from unix to iso将时间戳从 unix 重新格式化为 iso
【发布时间】:2016-04-28 13:39:20
【问题描述】:

我有 Json 输入数据,我需要将时间戳从 unix-time 重新格式化为 ISO 8601(以便之后处理文件)。 我试图通过使用来做到这一点: <input.json jq .[2].timestamp |= jq todate >output.json 这是以正确的方式重新格式化时间戳,但是我如何将重新格式化的时间戳恢复到原始文件中?我的目标是获取原始文件及其所有信息,但重新格式化时间戳。

它可以像我想在 https://jqplay.org/ 那样工作,但不能在命令行中。 感谢您的帮助!

示例输入:

[
{
"channelId": 9088,
"errorCode": 0,
"value": 0,
"timestamp": 1460258309
},
{
"channelId": 10087,
"errorCode": 0,
"value": 1000,
"timestamp": 1460258294
},
{
"channelId": 10086,
"errorCode": 0,
"value": 90,
"timestamp": 1460258294
},
{
"errorCode": 0,
"errorLine": ""
 }
]

想要的输出:

[
{
"channelId": 9088,
"errorCode": 0,
"value": 0,
"timestamp": 2016-04-10T03:18:14Z
},
{
"channelId": 10087,
"errorCode": 0,
"value": 1000,
"timestamp": 2016-04-10T03:18:14Z
},
{
"channelId": 10086,
"errorCode": 0,
"value": 90,
"timestamp": 2016-04-10T03:18:14Z
},
{
"errorCode": 0,
"errorLine": ""
 }
]

【问题讨论】:

  • 您能提供一个示例输入及其预期输出吗?此外,您可能的意思是使用jq '.[2].timestamp |= todate',即使用单引号并且没有额外的 jq 调用。
  • 添加了输入和预期输出。如果我跳过第二个 'jq' cmd,我会收到命令拼写错误或找不到的错误。这个问题有一个通用的解决方案吗?当我尝试使用'|'时,我总是遇到这个问题

标签: unix-timestamp jq


【解决方案1】:

根据您的意见:

 <input.json jq 'map(if .timestamp then .timestamp |= todate else . end)'  

输出是:

[
  {
    "channelId": 9088,
    "errorCode": 0,
    "value": 0,
    "timestamp": "2016-04-10T03:18:29Z"
  },
  {
    "channelId": 10087,
    "errorCode": 0,
    "value": 1000,
    "timestamp": "2016-04-10T03:18:14Z"
  },
  {
    "channelId": 10086,
    "errorCode": 0,
    "value": 90,
    "timestamp": "2016-04-10T03:18:14Z"
  },
  {
    "errorCode": 0,
    "errorLine": ""
  }
]

【讨论】:

    【解决方案2】:

    如果您希望每次出现的“时间戳”都被转换(无论它出现在哪里),那么如果您的 jq 有 walk/1 您可以使用如下所示的过滤器:

    jq -n '[{timestamp: (24*60*60)}] | walk(if type == "object" and .timestamp then .timestamp |= todate else . end)'
    [
      {
        "timestamp": "1970-01-02T00:00:00Z"
      }
    ]
    

    如果你的jq没有walk/1,那么你可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq复制它的定义

    【讨论】:

    • 抱歉,我不知道如何添加 walk 的定义,我只是在使用 jq 的可执行 *.exe 版本。我在我的问题中添加了一个示例输入/输出。有没有不加walk的办法解决问题?
    • 要添加walk/1(或任何函数),您可以将其定义放在过滤器的其余部分之前,例如jq -n 'def walk(f): . as $in | if type == "object" then reduce keys_unsorted[] as $key ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f elif type == "array" then map( walk(f) ) | f else f end; [{timestamp: (24*60*60)}] | walk(if type == "object" and .timestamp then .timestamp |= todate else . end)'。另一种方法是将其放入您的 ~/.jq 文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多