You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Shell脚本中的日期转换与减法运算问题求助

解决GNU Date无法解析紧凑格式日期的问题

你的问题出在date命令没法直接识别20180123143852这种紧凑的数字串作为有效日期。要解决这个问题,我们需要先把这个格式转换成date能理解的日期格式,再执行减法运算。

这里有两种简单的实现方式:

方法1:手动拆分格式(直观易懂)

我们可以通过字符串截取,给紧凑的日期时间串加上分隔符,转换成YYYY-MM-DD HH:MM:SS这种标准格式:

# 你的原始日期时间变量
datetime=20180123143852
# 指定要减去的天数
date_diff=2

# 转换成date可识别的格式
formatted_datetime="${datetime:0:4}-${datetime:4:2}-${datetime:6:2} ${datetime:8:2}:${datetime:10:2}:${datetime:12:2}"

# 计算目标日期
dby_date=$(date -d "$formatted_datetime - $date_diff days" +%Y-%m-%d)

# 输出结果
echo $dby_date  # 会输出 2018-01-21

方法2:简化格式拆分(更简洁)

其实date命令可以识别YYYYMMDD HHMMSS这种空格分隔的格式,所以我们只需要把日期部分和时间部分分开即可,不用加横杠和冒号:

datetime=20180123143852
date_diff=2

# 直接拆分日期和时间部分,用空格分隔
dby_date=$(date -d "${datetime:0:8} ${datetime:8:6} - $date_diff days" +%Y-%m-%d)

echo $dby_date  # 同样输出 2018-01-21

为什么原来的命令会报错?

date命令需要明确的日期格式提示才能解析输入,20180123143852这种无分隔符的数字串不在它默认识别的格式列表里,所以当你直接传入"$datetime - $date_diff "时,它会判定这是一个无效日期,抛出invalid date错误。

注意:以上方法适用于Linux系统的GNU Date命令。如果你用的是macOS的BSD Date,语法会有差异,需要用date -v -${date_diff}d这类写法。

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

火山引擎 最新活动