2010-07-12 4 views
18

Étant donné jour de l'année, comment puis-je obtenir la semaine de l'année en utilisant Bash?obtenir la semaine de l'année à partir du jour de l'année

+0

Bien que vous pourriez obtenir une réponse à cela ici, je pense que cette question peut être plus approprié pour notre site sœur stackoverflow.com. – Chopper3

+1

Non seulement est-ce une question de programmation, mais ressemble étrangement à mes devoirs. Incidemment, l'utilisation de Bash pour cela est un bon exemple d'utilisation du mauvais outil pour un travail. –

+1

+1 n'utilise pas Bash pour les calculs de date - les machines Linux/UNIX modernes seront livrées avec un Python ou Perl mis à jour par défaut. Utilisez le meilleur outil pour le travail. –

Répondre

33

En utilisant la commande date, vous pouvez afficher la semaine de l'année en utilisant le paramètre de format « % V »:

/bin/date +%V 

Vous pouvez dire date pour analyser et mettre en forme une date personnalisée au lieu de celui en cours en utilisant la paramètre "-d":

/bin/date -d "20100215" 

Ensuite, le mélange des deux options, vous pouvez appliquer un format personnalisé à une date personnalisée:

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

Dommage que votre solution ne fonctionne qu'avec la version GNU de la date. La version de Solaris ne prend pas en charge le commutateur -d et l'option de format% V. – basvdlei

+6

Également '% U' (début du dimanche, 00-53) ou'% W' (début du lundi, 00-53) (en plus de '% V' (ISO, lundi, début, 01-53)) selon la semaine -nombre de système que vous utilisez. –

+0

La version Solaris de date, qui ne peut pas prendre en charge -d peut être résolue en remplaçant la version de sunfreeware.com de la date. – conandor

3

Si vous utilisez GNU date vous pouvez utiliser des dates relatives à ceci:

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

Cela vous donne une réponse très simpliste, mais ne se fondent pas sur date:

$ echo $((doy/7)) 

qui ne fait pas attention au jour de la semaine.

est ici une démonstration des systèmes de numérotation de semaine:

$ 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 
Questions connexes