使用 jq 设置日期时间的格式

Format date time using jq

提问人:Anton Teterine 提问时间:10/26/2023 更新时间:10/26/2023 访问量:88

问:

我有一个 bash (sh) 脚本,它进行多个 API 调用并返回字符串值。 其中之一是返回的 JSON 对象的“created_at”属性。

released_at=$(echo -E "${json_response}" | jq -r '.[0].released_at'")

以 ISO 8601 格式返回的值:"released_at": "2023-09-27T17:36:07.182Z"

我希望它显示为Wednesday, September 27, 2023

实现这一目标的最短方法是什么?

谢谢!

bash 日期 sh jq ISO8601

评论

2赞 Charles Duffy 10/26/2023
旁白:如果你需要兼容性,你根本不应该使用。请参阅 echo 的 POSIX 规范 -- 在合规的实现中,唯一允许做的就是在输出上写入字符串。为什么 printf 比 echo 好?Unix和Linux上,更详细地介绍了。shecho -Eecho -E-E
1赞 Charles Duffy 10/26/2023
至于你的问题 - 看看 和 - 一个将解析出您当前的字符串,另一个将结果形成您选择的不同格式。strptimestrftime
1赞 Charles Duffy 10/26/2023
(也就是说,标准化/可移植的,不要超过秒精度;不过,对于这里的用例来说,这似乎很好,因为你实际上并没有使用秒精度数据)strftimestrptime
0赞 Charles Duffy 10/26/2023
(顺便说一句,bash 和 sh 绝对不是一回事;即使 sh 是操作系统上 bash 的符号链接,它在以名称启动时会关闭某些功能)sh

答:

1赞 Shawn 10/26/2023 #1

如果您使用的是基于 Linux 的操作系统,GNU date 命令可以格式化时间并理解以 ISO-8601 格式给出的时间戳:

$ date -d "$released_at" +"%A, %B %d, %Y"
Wednesday, September 27, 2023

评论

0赞 Charles Duffy 10/26/2023
是的,但是你不能从 jq 调用(它故意没有任何功能允许调用任意命令这样不安全的事情),那么这如何回答这个问题呢?date
0赞 Shawn 10/26/2023
@CharlesDuffy 不可以,但您可以从 shell 脚本中调用它,可以在他们的问题中使用变量 OP shows setting(当然这是我使用的),或者直接使用date -d "$(... | jq -r '.[0].released_at')" ...
1赞 Charles Duffy 10/26/2023
是的,但一般来说,这是一种糟糕的方法——如果你有一个迭代数千条记录的 jq 程序,你不想用运行数千个副本的 shell 命令来替换它。jq 内置了日期解析和日期格式化功能;为什么不使用它们呢?/bin/date
0赞 Shawn 10/26/2023
@CharlesDuffy 遍历数千条记录从何而来?
1赞 Charles Duffy 10/26/2023
我不同意。当 OP 说“我如何用 jq 做 X?”时,答案应该告诉他们如何用 jq 做 X,这种方式在许多不同的场景中都像 jq 本身一样灵活和有用。决定当他们说“使用 jq”时,他们并不是真正的意思,并且使用不同工具(具有截然不同的性能特征)的解决方法(就此而言,甚至根本不谈论 jq)是一个完全可以接受的答案......我看不见。
2赞 Charles Duffy 10/26/2023 #2

JQ 提供对本地操作系统和功能的访问。(请注意,在使用这些时需要注意可移植性:一些 libc 实现提供的运算符多于 POSIX 保证)。strftimestrptime

jq '
  .[0].released_at |                # extract field
  split(".")[0] |                  # strip seconds (not portably parsable)
  strptime("%Y-%m-%dT%H:%M:%S") |  # parse with strptime
  strftime("%A, %B, %Y")           # format with strftime
' <<'EOF'
[
  {"released_at": "2023-09-27T17:36:07.182Z"}
]
EOF

...作为输出发射:

"Wednesday, September, 2023"

评论

0赞 Anton Teterine 10/26/2023
这成功了,而不是jq '.[0].released_at | split(".")[0] | strptime("%Y-%m-%dT%H:%M:%S") | strftime("%A, %B %d, %Y")')jq '.[0].jq '.[].
1赞 Léa Gris 10/26/2023
或者jq -r '.[0].released_at | .[0:19]+"Z" | fromdateiso8601 | strftime("%A, %B %d, %Y")'