Necesito el número de la semana anterior del mes.
En la 2.ª semana de marzo, la semana anterior sería la 1. En la 1.ª semana de abril, la semana anterior sería la 5.
Mi semana comienza el lunes.
WEEK=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))
¿Cómo puedo restar uno de esto para obtener la semana anterior (si la semana es igual a 1, tengo una excepción, así que no tengo que preocuparme por eso)?
También sería bueno que febrero, con sólo 4 semanas, se reconociera automáticamente.
Respuesta1
Si no me equivoco, su expresión (reorganizada un poco aquí) encuentra el número de semana correspondiente al primer día del mes actual, el número de semana correspondiente a hoy y calcula la diferencia como semana del mes.
first=$(date -d "-$(($(date +%d)-1)) days")
weekofmon=$(( 1 + $(date +%V) - $(date -d "$first" +%V) ))
Si eso es correcto, y desea la semana del mes de la semana pasada, ¿no debería ser suficiente simplemente reemplazar "hoy" por "hace 7 días" (en todos los lugares) para obtener el mes de la semana correspondiente a ¿esa fecha?
now="7 days ago"
first=$(date -d "$now - $(($(date +%d -d "$now" )-1)) days")
weekofmon=$(( 1 + 10#$(date +%V -d "$now") - 10#$(date -d "$first" +%V) ))
Se basa en date
poder analizar expresiones como "hace 7 días - 3 días". date +%V
imprime números de semana <10 con un cero a la izquierda, lo que haría que se interpretaran como números octales, rompiéndose 08
y 09
. Agregue 10#
para forzar que bash tome los números en decimal.
Una forma un poco más corta de obtener el primer día del mismo mes:
first=$(date -d "$now" +"%Y-%m-01")
(formato diferente, pero date
debería poder interpretarlo).