从给定日期减去bash中的月份数

问题描述 投票:3回答:1

我想从给定的日期中减去月份。

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

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

linux bash shell
1个回答
2
投票

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

从:29.7日期字符串中的相对项:

单位的绒毛可能导致相关项目出现问题。对于例如,“ 2003-07-31 -1个月”的计算结果为2003-07-01,因为2003-06-31是无效日期

某些解决方案:

  1. 将“ 1个月前”作为向后移动天数的请求,其中N为max(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"
© www.soinside.com 2019 - 2024. All rights reserved.