Как узнать последнее воскресенье месяца

Как узнать последнее воскресенье месяца

Я пытаюсь написать скрипт на ESXI и мне нужно добавить "если последнее воскресенье месяца". Я пытаюсь

date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d

Это может не работать, но работает на Debian.

На ESXI сейчас выводится август

решение1

Я думаю, что вопрос в том,

Могу ли я, зная конкретную дату, определить, является ли она последним воскресеньем месяца?

а не более общий вопрос

В какой день конкретного месяца приходится его последнее воскресенье?

Учитывая это, мы можем разделить задачу на две части:

  • Сегодня воскресенье?
  • Это последняя неделя месяца?

Для первой части тест достаточно прост:

date -d "$date" +%a  # outputs "Sun" for a Sunday

Мы можем это проверить:

test $(date -d "$date" +%a) = Sun  # success if $date is a Sunday

Теперь, чтобы проверить, является ли это последней неделей месяца, мы можем добавить одну неделю к дате и посмотреть, даст ли это нам один из первых 7 дней следующего месяца:

test $(date -d "$date + 1week" +%e) -le 7

Поскольку день недели $date + 1weekсовпадает с днем ​​недели $date, мы можем сгенерировать обе части теста за один раз и использовать проверку регулярного выражения Bash:

if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
    echo "$date is the last Sunday of the month!"
fi

Протестировано:

$ ./330571.sh 2016-12-01
$ ./330571.sh 2016-12-04
$ ./330571.sh 2016-12-25
2016-12-25 is the last Sunday of the month!
$ ./330571.sh 2017-01-28
$ ./330571.sh 2017-01-29
2017-01-29 is the last Sunday of the month!

решение2

Вы можете сделать это с помощью calи awk:

$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25

Объяснение

calпечатает текущий месяц с воскресеньем в качестве первого столбца (по умолчанию):

$ cal
    December 2016
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Команда awkсопоставляет строки, начинающиеся с нуля или более пробелов, за которыми следует цифра, и сохраняет первое поле в переменной d. В конце dбудет последнее воскресенье текущего месяца.

решение3

Я нашел эту статью, когда пытался получить последний четверг, но она сработает и для любого другого дня. Вот мое решение (совместимое с Bash):

thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...

По сути, он проверяет, находится ли день на следующей неделе в том же месяце. Должно работать для переходов Дек/Янв, так как я использовал -neвместо -geили -gt.

решение4

В последнее воскресенье месяца:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]

В первое воскресенье месяца:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]

Связанный контент