2010-07-12 12 views
18

Dado día del año, ¿cómo puedo obtener la semana del año usando Bash?obtener la semana del año a partir del día del año

+0

Aunque es posible que obtenga una respuesta para esto de aquí creo que esta pregunta puede ser más apropiado para nuestro sitio de la hermana stackoverflow.com. – Chopper3

+1

No solo es una pregunta de programación sino que se parece sospechosamente a mi tarea. Por cierto, usar Bash para esto es un buen ejemplo de usar la herramienta incorrecta para un trabajo. –

+1

+1 no utilice Bash para cálculos de fecha: las modernas máquinas Linux/UNIX se enviarán con un Python o Perl actualizados de manera predeterminada. Use la mejor herramienta para el trabajo. –

Respuesta

33

Usando el comando date, puede mostrar la semana del año utilizando el "% V" parámetro de formato:

/bin/date +%V 

le puede decir date para analizar y dar formato a una fecha personalizada en lugar de la actual utilizando la "-d" parámetro:

/bin/date -d "20100215" 

a continuación, la mezcla de las dos opciones, se puede aplicar un formato personalizado a una fecha personalizada:

/bin/date -d "20100215" +%V 
+1

Lástima que su solución solo funcione con la versión de fecha GNU. La versión de fecha de Solaris no es compatible con el modificador -d y la opción de formato% V. – basvdlei

+6

También '% U' (Sunday start, 00-53) o'% W' (Monday start, 00-53) (además de '% V' (ISO, Monday start, 01-53)) según la semana -número de sistema que utiliza. –

+0

Versión de fecha de Solaris, que no puede admitir -d se puede resolver reemplazando la versión de fecha de sunfreeware.com. – conandor

3

Si estás usando GNU date puede utilizar fechas relativas de esta manera:

$ doy=193 
$ date -d "Jan 1 +$((doy -1)) days" +%U 
28 

Esto le daría una respuesta muy simplista, pero no se basa en date:

$ echo $((doy/7)) 

cuales no le presta atención al día de la semana.

Aquí es una demostración de los sistemas de numeración semana:

$ printf "\nDate\t\tDOW\tDOY\t%%U %%V %%W\n"; \ 
for d in "Jan "{1..4}" 2010" \ 
"Dec "{25..31}" 2010" \ 
"Jan "{1..4}" 2011"; \ 
do printf "%s\t" "$d"; \ 
date -d "$d" +"%a%t%j%t%U %V %W"; \ 
done 

Date   DOW  DOY  %U %V %W 
Jan 1 2010  Fri  001  00 53 00 
Jan 2 2010  Sat  002  00 53 00 
Jan 3 2010  Sun  003  01 53 00 
Jan 4 2010  Mon  004  01 01 01 
Dec 25 2010  Sat  359  51 51 51 
Dec 26 2010  Sun  360  52 51 51 
Dec 27 2010  Mon  361  52 52 52 
Dec 28 2010  Tue  362  52 52 52 
Dec 29 2010  Wed  363  52 52 52 
Dec 30 2010  Thu  364  52 52 52 
Dec 31 2010  Fri  365  52 52 52 
Jan 1 2011  Sat  001  00 52 00 
Jan 2 2011  Sun  002  01 52 00 
Jan 3 2011  Mon  003  01 01 01 
Jan 4 2011  Tue  004  01 01 01 
Cuestiones relacionadas