Ответ 1
Для 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 обычных дней:
( Успение: Не рассматривая законные праздники, потому что это просто выходит далеко за рамки того, что я могу вам помочь в оболочке script:)
Рассмотрим 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 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")
И это должно сделать это =)