提问人:Anton Teterine 提问时间:10/26/2023 更新时间:10/26/2023 访问量:88
使用 jq 设置日期时间的格式
Format date time using jq
问:
我有一个 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
实现这一目标的最短方法是什么?
谢谢!
答:
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 保证)。strftime
strptime
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")'
评论
sh
echo -E
echo -E
-E
strptime
strftime
strftime
strptime
sh