Cómo saber el último domingo del mes

Cómo saber el último domingo del mes

Intento escribir un script en ESXI y necesito agregar "si es el último domingo del mes". lo intento

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

No puede funcionar, pero funciona en Debian.

En ESXI ahora sale agosto

Respuesta1

Creo que la pregunta es

Dada una fecha en particular, ¿puedo determinar si es el último domingo del mes?

y no la pregunta más general

Dado un mes en particular, ¿qué día es su último domingo?

Teniendo esto en cuenta, podemos dividir el problema en dos:

  • ¿La fecha es domingo?
  • ¿Es la última semana del mes?

Para la primera parte, la prueba es bastante sencilla:

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

Podemos probar eso:

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

Ahora, para probar si es la última semana del mes, podemos agregar una semana a la fecha y ver si eso nos da uno de los primeros 7 días del próximo mes:

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

Dado que el día de la semana de $date + 1weekes el mismo que el de $date, podemos generar ambas partes de la prueba de una vez y usar una prueba de expresión regular de Bash:

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

Probado:

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

Respuesta2

Puedes hacer esto con caly awk:

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

Explicación

calimprime el mes actual con el domingo como primera columna (por defecto):

$ 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

El awkcomando busca líneas que comiencen con cero o más espacios, seguidas de un dígito, y almacena el primer campo en la variable d. Al finalizar, dserá el último domingo del mes en curso.

Respuesta3

Encontré este artículo cuando intentaba obtener el último jueves, pero también funcionaría para cualquier otro día. Aquí está mi solución (compatible con Bash):

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

Básicamente, comprueba si el día de la próxima semana ocurre en el mismo mes. Debería funcionar para las transiciones de diciembre/enero, ya que usé -neen lugar de -geo -gt.

Respuesta4

Para el último domingo del mes:

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

Para el primer domingo del mes:

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

información relacionada