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

tag*_*agg 5 linux bash shell

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

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

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

das*_*h-o 4

正如“info date”中所示,计算相对月份(1个月前等)的日期是有问题的,有时会导致意想不到的结果:

\n\n

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

\n\n
\n

单位中的模糊可能会导致相关项目出现问题。例如,\xe2\x80\x982003-07-31 -1 Month\xe2\x80\x99 可能计算为 2003-07-01,因为\n 2003-06-31 是无效日期

\n
\n\n

一些解决方案:

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

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

\n\n

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

\n\n
IDATE=2019-12-31\nN_MONTH=-1\nDD_PART=$(date +\'%d\' -d "$IDATE")\nYYYYMM=$(date +\'%Y-%m\' -d "$(date +\'%Y-%m-01\' -d "$IDATE") $N_MONTH month")\nLAST_DAY_IN_YYYYMM=$(date +\'%d\' -d "$YYYYMM-01 +1month -1day")\nif [[ "$LAST_DAY_IN_YYYYMM" -lt "$DD_PART" ]] ; then\n    DD_PART=$LAST_DAY_IN_YYYYMM\nfi\necho "$YYYYMM-$DD_PART"\n
Run Code Online (Sandbox Code Playgroud)\n