Como saber no último domingo do mês

1

Eu tento escrever script no ESXI e preciso adicionar "se no último domingo do mês". Eu tento

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

Não funciona, mas funciona no Debian.

No ESXI agora produzimos agosto

    
por Nikita 15.12.2016 / 11:39

3 respostas

4

Eu acredito que a questão é

Given a particular date, can I determine whether it is the last Sunday in the month?

e não a questão mais geral

Given a particular month, on what day is its last Sunday?

Dado que, podemos dividir o problema em dois:

  • A data é um 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 as duas 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!
    
por 15.12.2016 / 15:19
1

Você pode fazer isso com cal e awk :

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

Explicação

cal imprime o mês atual com o domingo como a 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 comando awk corresponde às linhas que começam com zero ou mais espaços, seguidas por um dígito, e armazenam o primeiro campo na variável d . No final, d será o último domingo do mês atual.

    
por 15.12.2016 / 12:00
0

Script BASH usando apenas date

#!/bin/bash

# print last Sundays for 2016 and 2017

for y in {2016..2017}
do
  for m in {1..12}
  do
    first_day_of_month=$y/$m/1
    days_in_month=$(date +%d -d "$first_day_of_month month day ago")
    day_of_week_of_last_day=$(date +%w -d "$first_day_of_month month day ago")
    last_sunday=$(date -d "$first_day_of_month $days_in_month day $[1+$day_of_week_of_last_day] day ago")
    echo $last_sunday
  done
  echo
done

# print last Sunday for current month

first_day_of_month=$(date +%m/1)
days_in_month=$(date +%d -d "$first_day_of_month month day ago")
day_of_week_of_last_day=$(date +%w -d "$first_day_of_month month day ago")
last_sunday=$(date -d "$first_day_of_month $days_in_month day $[1+$day_of_week_of_last_day] day ago")
echo $last_sunday

Saída

Sun Jan 31 00:00:00 GMT 2016
Sun Feb 28 00:00:00 GMT 2016
Sun Mar 27 00:00:00 GMT 2016
Sun Apr 24 00:00:00 BST 2016
Sun May 29 00:00:00 BST 2016
Sun Jun 26 00:00:00 BST 2016
Sun Jul 31 00:00:00 BST 2016
Sun Aug 28 00:00:00 BST 2016
Sun Sep 25 00:00:00 BST 2016
Sun Oct 30 00:00:00 BST 2016
Sun Nov 27 00:00:00 GMT 2016
Sun Dec 25 00:00:00 GMT 2016

Sun Jan 29 00:00:00 GMT 2017
Sun Feb 26 00:00:00 GMT 2017
Sun Mar 26 00:00:00 GMT 2017
Sun Apr 30 00:00:00 BST 2017
Sun May 28 00:00:00 BST 2017
Sun Jun 25 00:00:00 BST 2017
Sun Jul 30 00:00:00 BST 2017
Sun Aug 27 00:00:00 BST 2017
Sun Sep 24 00:00:00 BST 2017
Sun Oct 29 00:00:00 BST 2017
Sun Nov 26 00:00:00 GMT 2017
Sun Dec 31 00:00:00 GMT 2017

Sun Dec 25 00:00:00 GMT 2016
    
por 15.12.2016 / 15:08

Tags