Подтвердить что ты не робот

Сегодня дата, минус X дней в оболочке script

Мне нужно создать три переменные, каждая для даты Year, Month и Day for Today, минус X дней. По этому вопросу я выберу случайное количество дней: 222.

Итак, если:

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

Я хочу за 222 дня до этого.

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

Изменить: требуется 222 рабочих дней вместо 222 обычных дней.

4b9b3361

Ответ 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")

И это должно сделать это =)

Ответ 2

date '+%Y' --date='222 days ago'

Ответ 3

epoch=$(( `date '+%s'` - ( 24 * 60 * 60 * 222 ) ))
year=`date -d "@$epoch" '+%Y'`
month=`date -d "@$epoch" '+%m'`
day=`date -d "@$epoch" '+%d'`

Должен сделать трюк.

Ответ 4

Вы можете получить точную прошлую дату из следующего в bash

Number=222
current_date=$(date +%Y%m%d)
past_date=$(date -d "$current_date - $Number days" +%Y%m%d)
echo "$current_date\t$past_date"

Надеюсь, это поможет!