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

标签 linux bash shell

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

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

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

最佳答案

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

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

The fuzz in units can cause problems with relative items. For example, ‘2003-07-31 -1 month’ might evaluate to 2003-07-01, because 2003-06-31 is an invalid date

一些解决方案:

  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"

关于linux - 从 bash 中的给定日期减去月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58430234/

相关文章:

linux - 如何使用 use as in linux 和汇编语言

linux - 如何使用 Bash 将柱状标记数据转换为 json?

c++ - 将字符串映射到唯一数字?

Linux bash 读取输出解释

shell - 通过 Shell 脚本创建 Route53 记录集

regex - 将 GNU sed 命令移植到 BSD sed

centos 6.3 中的 python cron 作业错误

Python 的子进程删除 Mysql 列和间距

bash - 没有传递参数时如何读取标准输入?

c - 如何离开(中断)waitpid()函数?