对于 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 date
: :
如果您使用的是 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 日期手册页
笔记:
在bash
和许多其他语言中,您不能以数字字符开头变量名,因此我date_
为您添加了前缀。
第二次更新:新要求 -使用 222 个工作日而不是 222 个常规日:
(假设:不考虑法定假日,因为这远远超出了我在 shell 脚本中可以帮助您的范围:)
考虑 222 个工作日:
- 每周5个工作日,即
floor(222/5) == 44 weeks
44 weeks * 7 days per week == 308 days
- 剩余天数:
222 % 5 == 2
- 所以
222 working days == 310 regular days
但是有一个问题!如果常规天数是308
或 的某个倍数7
,那么我们就可以了,因为从工作日开始的 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")
那应该这样做=)