首页 > 解决方案 > 从bash中的给定日期减去月份

问题描述

我想从给定日期减去几个月。

businessDate='2019-12-31'
diff=1
busDate=$(date --date="$businessDate -$diff month" +%Y-%m-%d)
echo "Date: $busDate"

此代码返回 2019-12-01 而不是 2019-11-30。有人可以建议一个解决方案来获得正确的日期吗?

标签: linuxbashshell

解决方案


如“信息日期”中所示,计算相对月份(1 个月前等)的日期是有问题的,有时会导致意外结果:

来自:29.7 日期字符串中的相关项:

单位中的模糊可能会导致相关项目出现问题。例如,“2003-07-31 -1 月”可能评估为 2003-07-01,因为 2003-06-31 是无效日期

一些解决方案:

  1. 将“1 个月前”视为向后移动天数的请求,其中 N 是最大值(DD,上个月的天数)。
  2. 检查结果日期是否与原始日期的月份相同,并将日期从该月的第一天向后移动一天。这是处理 3 月/2 月过渡所必需的。
  3. 另一种方法是在当月的第一天执行日期移动(这将始终有效),然后限制日期的日期部分,但结果月份的最后一个日期。

第三种方法的好处是它表示月份移动。

选项 #3 的实现是 bash 有点麻烦,写 python/perl 代码可能更好。

IDATE=2019-12-31
N_MONTH=-1
DD_PART=$(date +'%d' -d "$IDATE")
YYYYMM=$(date +'%Y-%m' -d "$(date +'%Y-%m-01' -d "$IDATE") $N_MONTH month")
LAST_DAY_IN_YYYYMM=$(date +'%d' -d "$YYYYMM-01 +1month -1day")
if [[ "$LAST_DAY_IN_YYYYMM" -lt "$DD_PART" ]] ; then
    DD_PART=$LAST_DAY_IN_YYYYMM
fi
echo "$YYYYMM-$DD_PART"

推荐阅读