【问题标题】:Strptime with timezones and jq带时区和 jq 的 strptime
【发布时间】:2018-03-13 18:00:57
【问题描述】:

不知道我在这里做错了什么

getting_data | gunzip | jq -r '.time_field | strptime("%Y-%m-%dT%H:%M:%S.%fZ")'

错误返回如下:

jq: error (at <stdin>:0): date "2018-03-13T14:00:17.1614661Z" does not 
match format "%Y-%m-%dT%H:%M:%S.%fZ"

期望的输出是2018-03-13 14:00:17

【问题讨论】:

  • 如果您可以提供实际数据的最小工作示例(可能是echo '{"time_field": "2018-03-13T14:00:17.1614661Z"}' | ...)而不是这个getting_data | gunzip 存根,其他人可以测试他们的答案。
  • 顺便说一句,你可以把Z去掉两边,看看时区与问题无关
  • %f 格式化程序是否能够处理 7 位数字? (1614661)
  • @LuisMuñoz, ...一个更相关的问题是 %f 是否存在在本地 libc 中(这需要指定一个特定的平台,而 OP 没有' t 完成)。
  • @CharlesDuffy 您提供的示例是日期的显示方式,因此我正在尝试对其进行解析

标签: bash jq strptime


【解决方案1】:

所以我找到了一种解决方法来绕过 ZULU 偏移和纳秒,因为我不太关心纳秒。不知道是否有效

echo '{"time_field": "2018-03-13T14:00:17.1234567Z"}' | jq -r '
.time_field 
| split(".")[0] 
| strptime("%Y-%m-%dT%H:%M:%S") 
| mktime 
| strftime("%F %X")'

【讨论】:

    【解决方案2】:

    问题不在于时区,而在于纳秒字段; %f 在 C 的标准 strptime 中不可用。

    如果您知道自己的格式不会改变,则完全没有理由使用 strptimestrftime

    jq -r '.time_field | sub("^(?<date>[[:digit:]-]+)T(?<time>[[:digit:]:]+)[.].*";
                             "\(.date) \(.time)")' \
      <<<'{"time_field": "2018-03-13T14:00:17.1614661Z"}'
    

    ...正确发出:

    2018-03-13 14:00:17
    

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      相关资源
      最近更新 更多