You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash date命令处理时间仅返回午夜值,求排查原因

问题原因与解决方案

核心问题

你遇到的12:00 AM是date/printf解析时间失败后的默认结果(对应Unix纪元时间0点的转换值),根源有两个:

  1. 时间字符串带多余引号:用jq '.Data[0].sr'获取的结果包含双引号(如"Fri May 31 08:30:00 PM CDT 2024"),date无法识别带引号的时间格式。
  2. 语法错误:传给date -d的参数多了不必要的括号($srx),进一步导致解析失败;注释里的printf写法也完全错误(格式参数位置颠倒、转义字符写错)。

修正步骤

1. 获取正确的时间字符串

用jq -r选项输出不带双引号的原始时间文本,同时直接让jq读取文件(无需cat):

srx=$(jq -r '.Data[0].sr' "${D5}")
echo "$srx"  # 输出:Fri May 31 08:30:00 PM CDT 2024

2. 正确使用date格式化

去掉多余括号,直接传递干净的时间字符串:

srt=$(date -d "$srx" +"%I:%M %p")
echo "$srt"  # 输出:08:30 PM

3. 正确使用printf格式化(Bash 4.2+ 支持)

printf的%()T格式需要将时间字符串作为参数放在格式后面,同时修正转义字符:

# 将结果存入变量
printf -v srt "%(%I:%M %p)T" "$srx"
echo "$srt"  # 输出:08:30 PM

# 直接打印
printf "%(%I:%M %p)T\n" "$srx"

内容的提问来源于stack exchange,提问作者user1457613

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:16:10