Como saber o último domingo do mês

Como saber o último domingo do mês

tento escrever um script no ESXI e preciso adicionar "se for o último domingo do mês". eu tento

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

Pode não funcionar, mas funciona no Debian.

No ESXI agora sai em agosto

Responder1

Acredito que a questão seja

Dada uma data específica, posso determinar se é o último domingo do mês?

e não a questão mais geral

Dado um determinado mês, em que dia é o seu último domingo?

Diante disso, podemos dividir o problema em dois:

  • A data é domingo?
  • É a última semana do mês?

Para a primeira parte, o teste é bastante fácil:

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

Podemos testar isso:

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

Agora, para testar se é a última semana do mês, podemos adicionar uma semana à data e ver se isso nos dá um dos primeiros 7 dias do próximo mês:

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

Como o dia da semana de $date + 1weeké igual ao de $date, podemos gerar ambas as partes do teste de uma só vez e usar um teste de expressão regular Bash:

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

Testado:

$ ./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!

Responder2

Você pode fazer isso com cale awk:

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

Explicação

calimprime o mês atual com domingo como primeira coluna (por padrão):

$ 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

O awkcomando corresponde a linhas que começam com zero ou mais espaços, seguidos por um dígito, e armazena o primeiro campo na variável d. No final, dserá o último domingo do mês corrente.

Responder3

Encontrei este artigo ao tentar obter a última quinta-feira, mas funcionaria em qualquer outro dia também. Aqui está minha solução (compatível com Bash):

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

Essencialmente, verifica se o dia da próxima semana ocorre no mesmo mês. Deve funcionar para transições dezembro/janeiro, já que usei -neem vez de -geor -gt.

Responder4

Para o último domingo do mês:

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

Para o primeiro domingo do mês:

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

informação relacionada