Cómo determinar el número de semana del mes


10

En la CLI de Linux, ¿hay alguna forma de obtener el número de la semana del mes? ¿Tal vez hay otra forma de obtener esto con un simple datecomando (como )? Digamos que el día 1 al 7 es la primera semana, el día 8 al 14 es la segunda semana, y así sucesivamente.


¿Cómo define la semana del mes? ¿El número del día dividido por 7 y redondeado hacia abajo? ¿Número de domingos / lunes / lo que haya pasado?
mgorven

digamos de 1 a 7 días su primera semana, de 7 a 14 segunda semana, de 14 a 21 tercera y de 21 a fin de mes su cuarta semana. Sé que el script bash simple con date nad es una buena solución para esto, pero me pregunto si puedo di eso con un comando sin hacer un script.
B14D3

@ B14D3 su definición de "semana del mes" es bastante burda: ¿para qué utiliza esto específicamente?
voretaq7

1
Por nada estaba leyendo a hombre para una cita y eso me vino a la mente (a veces tengo pensamientos tan tontos). Entonces, ¿cuál será una mejor definición?
B14D3

Respuestas:


21

El datecomando no puede hacer esto internamente, por lo que necesita algo de aritmética externa.

echo $((($(date +%-d)-1)/7+1))

Editar: se agregó un signo menos entre% y d


Eso funciona bien, pero no entiendo por qué esta aritmética devuelve un entero.
B14D3

2
Bash solo hace aritmética de enteros.
mgorven

Wow no lo sabía. Thx: D
B14D3

44
Eso es correcto: los días 29+ son en la quinta semana del mes.
mgorven

55
Lo siento, no sé cómo formatear el comentario para que se vea mejor. De todos modos, es una buena idea implementar, sin embargo, si la fecha es 08 o 09, causará un error: -bash: (09: valor demasiado grande para la base (el token de error es "09"). Eso es porque si el valor numérico comienza con 0 , será interpretado como número octal por el lenguaje C, por lo que 08 09 no es válido. Para mí, la solución es cambiar de% d a% e,% e omite el 0 inicial: echo $ (((($ (date +% e) -1) / 7 + 1))
Shâu Shắc

2

Puedes usar esto:

Lunes primer día de la semana

WEEKNUMBER=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))

Domingo Abeto semana daty

WEEKNUMBER=$(( 1 + $(date +%U) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%U) ))

1

Prueba esto:

d=`date +%d` ; m=`date +%m` ; y=`date +%Y` ; cal $m $y | sed -n "3,$ p" | sed -n "/$d/{=;q;}"

no me parece simple: D y por hoy me da 5
B14D3

1

simplificando la solución de Victor Sanchez:

expr 1 + $(date +%V) - $(date +%V -d $(date +%Y-%m-01))

reemplace% V con% U si desea semanas comenzando el domingo.

por cierto: tenía que usar expr en lugar de $ ((...)) porque a este último no parece gustarle los números con ceros a la izquierda.


0

Si acepta herramientas externas en su búsqueda, pruebe dateutils . Tiene la noción de fechas de ocurrencia dentro de un mes, es decir, el 27 de abril de 2012 es el cuarto viernes de abril de 2012, que solo coincide con la definición de su semana. Para obtener ese número, use:

dconv 2012-04-27 -f %c
=>
  04

%c(cuenta) es el especificador de formato para la ocurrencia dentro del mes. O para ser aún más genial intentarlo

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.