我想从给定日期中减去月份。
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 个月前”视为向后移动天数的请求,其中 N 为最大值(DD,上个月的天数)。
- 检查结果日期是否与原始日期相同,并将日期从该月的第一天向后移动一天。这是处理 3 月/2 月过渡所必需的。
- 另一种方法是在月份的第一天执行日期移动(这将始终有效),然后将日期的天部分,但结果月份中的最后一个日期设置为上限。
第三种方法的好处是它表示月份的移动。
选项 #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/