Расчет даты с использованием даты GNU - PullRequest
10 голосов
/ 14 апреля 2011

Используя утилиту командной строки даты GNU, я знаю:

  • как вычесть 3 дня из любой указанной даты:
    date -d "20110405 -3 days" "+%Y%m%d"
    20110402

  • как узнать последнюю пятницу с сегодняшнего дня:
    date -d "last friday" "+%Y%m%d"
    20110408

Но я не знаю, какчтобы получить последнюю пятницу от любой указанной даты:
date -d "20110405 last friday" "+%Y%m%d"
Просто возвращает данную дату:
20110405

Есть идеи о том, как это сделать?Если однострочник невозможен, несколько строк сценария также будут полезны.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

Безобразно, но одна строка:

date -d "20110405 -2 days -$(date -d '20110405' '+%w') days" "+%Y%m%d"

РЕДАКТИРОВАТЬ : см. Комментарии.

date -d "20110405 -$(date -d "20110405 +2 days" +%u) days" "+%Y%m%d"

Пояснение:

  • % w возвращает день недели. Пятница = 5, поэтому снимите еще 2 дня, чтобы получить правильное смещение.
  • Работает как «20110405 -x дней», где x - количество дней до прошлой пятницы.

Мне не нравится, что он повторяет строку даты, но, надеюсь, это поможет.

2 голосов
/ 17 февраля 2015

Пример сценария (на основе принятого ответа)

DT="20170601"
# get the Friday before $DT
# expected value is 20170526
date -d "$DT -`date -d "$DT +2 days" +%u` days" "+%Y%m%d"

Дополнительные примеры с использованием недокументированных возможностей даты GNU (от unix.com )

# assign a value to the variable DT for the examples below
DT="2006-10-01 06:55:55"
echo $DT

# add 2 days, one hour and 5 sec to any date
date --date "$DT  2 days 1 hour 5 sec"

# subtract from any date
date --date "$DT 3 days 5 hours 10 sec ago"
date --date "$DT -3 days -5 hours -10 sec"

# or any mix of +/-. What will be the date in 3 months less 5 days?
date --date "now +3 months -5 days"
...