Bash date命令处理时间仅返回午夜值,求排查原因
问题原因与解决方案
核心问题
你遇到的12:00 AM是date/printf解析时间失败后的默认结果(对应Unix纪元时间0点的转换值),根源有两个:
- 时间字符串带多余引号:用
jq '.Data[0].sr'获取的结果包含双引号(如"Fri May 31 08:30:00 PM CDT 2024"),date无法识别带引号的时间格式。 - 语法错误:传给
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
相关产品推荐
相关产品推荐

