linux - 从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。有人可以建议一个解决方案来获得正确的日期吗?
解决方案
如“信息日期”中所示,计算相对月份(1 个月前等)的日期是有问题的,有时会导致意外结果:
来自:29.7 日期字符串中的相关项:
单位中的模糊可能会导致相关项目出现问题。例如,“2003-07-31 -1 月”可能评估为 2003-07-01,因为 2003-06-31 是无效日期
一些解决方案:
- 将“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"
推荐阅读
- c# - 在 Ext.NET 中使用外部 URL 加载 IFrame
- reactjs - 跟踪:节点类型 SpreadProperty 已在 Object.isSpreadProperty 处重命名为 SpreadElement
- kotlin - kotlin - 以年计算复利
- php - Prestashop:未捕获的错误:在中找不到类“smartblog”
- c# - 参考交互触发控制
- node.js - Mongoose 错误必须传入有效的 bson 解析器
- apache-spark - 如何解决错误“AttributeError:'SparkSession'对象没有属性'serializer'?
- mysql - 在 VB.net 中打印和存储收据
- javascript - 创建艺术地图并将 html 放置在特定坐标处
- office-js - 自动将加载项权限分配给新用户,Exchange on Premises