bash - 今天的日期,在 shell 脚本中减去 X 天

标签 bash sh

我需要创建三个变量,每个变量代表今天减去 X 天后的年、月和日。对于这个问题,我将随机选择天数:222。

如果:

TodayYear=`date +%Y`
TodayMonth=`date +%m`
TodayDay=`date +%d`

我要的是这之前的222天。

222days_before_TodayYear=???
222days_before_TodayMonth=???
222days_before_TodayDay=???

编辑:需要 222 个工作 天而不是 222 个正常工作日。

最佳答案

对于 GNU date:

date_222days_before_TodayYear=$(date --date="222 days ago" +"%Y")
date_222days_before_TodayMonth=$(date --date="222 days ago" +"%m")
date_222days_before_TodayDay=$(date --date="222 days ago" +"%d")

对于 BSD 日期::

如果您使用的是 OS X 或 FreeBSD,请改用以下内容,因为 BSD 日期与 GNU 日期不同:

date_222days_before_TodayYear=$(date -j -v-222d +"%Y")
date_222days_before_TodayMonth=$(date -j -v-222d +"%m")
date_222days_before_TodayDay=$(date -j -v-222d +"%d")

来源:BSD date manual page

注意:

bash 和许多其他语言中,变量名不能以数字字符开头,因此我为您在它们前面加上了 date_ 前缀。


第二次更新:新要求 - 使用 222 个工作日而不是 222 个常规日:

(假设:不考虑法定节假日,因为这远远超出了我在 shell 脚本中可以帮助您的范围:)

考虑 222 个工作日:

  • 每周 5 个工作日,即 floor(222/5) == 44 周
  • 44 周 * 每周 7 天 == 308 天
  • 剩余的额外天数:222 % 5 == 2
  • 因此 222 个工作日 == 310 个正常工作日

但是,有一个陷阱!如果常规天数是 3087 的倍数,那么我们就没问题了,因为从一个工作日算起的任何 7 天前的倍数仍然是工作日。所以我们需要考虑今天是星期一还是星期二:

  • 如果今天是星期一,我们会在星期四到达星期六
  • 如果今天是星期二,我们会在我们希望星期五的地方得到星期日

所以你看,如果今天是星期一或星期二,我们还需要额外偏移 2 天;所以让我们在继续之前先找出它:

#!/bin/bash

# Use 310 days as offset instead of 222
offset=310
# Find locale's abbreviated weekday name (e.g., Sun)
today=$(date -j +"%a")
# Check for Mon/Tue
if [[ "$today" == "Mon" ]] || [[ "$today" == "Tue" ]]; then
     offset=$((offset+2))
fi

date_222_working_days_before_TodayYear=$(date -j -v-${offset}d +"%Y")
date_222_working_days_before_TodayMonth=$(date -j -v-${offset}d +"%m")
date_222_working_days_before_TodayDay=$(date -j -v-${offset}d +"%d")

那就应该做到 =)

关于bash - 今天的日期,在 shell 脚本中减去 X 天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533661/

相关文章:

bash 脚本在获取时产生不同的结果

bash - 如何检查可执行文件的路径扩展

shell - 使用 cURL 登录 Stack Overflow

syntax - 破折号双分号 (;;) 语法

bash - 带有 OR 逻辑的 Grep 命令

linux - SQL "1.%"的 Bash 等价物

php - html表单按钮运行命令php exec

linux - Linux 中的串口路由

bash - 在 bash 中修剪尾部和前导斜杠 - 加入参数替换?

grep - 如何通过grep查找不同行中包含两个关键字的文件?