Comment déterminer le nombre de semaines du mois


10

Sur la CLI Linux, existe-t-il un moyen d'obtenir le numéro de la semaine du mois? Peut-être existe-t-il un autre moyen d'obtenir cela avec une simple datecommande (comme )? Disons que les jours 1 à 7 sont la première semaine, les jours 8 à 14 la deuxième semaine, etc.


Comment définissez-vous la semaine du mois? Le numéro du jour divisé par 7 et arrondi vers le bas? Nombre de dimanches / lundis / tout ce qui s'est passé?
mgorven

disons de un à 7 jours sa 1ère semaine, de 7 à 14 deuxième semaine, de 14 à 21 troisième et de 21 à fin de mois sa quatrième semaine. Je sais que le script bash simple avec date nad est une bonne solution pour cela, mais je me demande si je peux le faire avec une seule commande sans faire de script.
B14D3

@ B14D3 votre définition de "semaine du mois" est assez grossière - pour quelle raison l'utilisez-vous précisément?
voretaq7

1
Pour rien, je lisais l'homme pour un rendez-vous et cela m'est venu à l'esprit (Parfois, j'ai des pensées si stupides). Alors, quelle sera une meilleure définition?
B14D3

Réponses:


21

La datecommande ne peut pas faire cela en interne, vous avez donc besoin d'une arithmétique externe.

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

Edit: Ajout d'un signe moins entre le% et le d


Cela fonctionne bien, mais je ne comprends pas pourquoi cette arithmétique renvoie un entier?
B14D3

2
Bash ne fait que de l'arithmétique entière.
mgorven

Wow ne le savait pas. Thx: D
B14D3

4
C'est exact - les jours 29+ sont dans la 5ème semaine du mois.
mgorven

5
Désolé, je ne sais pas comment formater le commentaire pour qu'il soit plus joli. Quoi qu'il en soit, bonne idée à implémenter, cependant si la date est 08 ou 09, cela provoquera une erreur: -bash: (09: valeur trop grande pour la base (le jeton d'erreur est "09"). C'est parce que si la valeur numérique commence par 0 , il sera interprété comme un nombre octal par le langage C, donc 08 09 ne sont pas valides. Pour moi, la solution consiste à passer de% d à% e,% e omet le 0 de tête: echo $ ((($ (date +%) e) -1) / 7 + 1))
Shâu Shắc

2

Vous pouvez utiliser ceci:

Lundi Premier jour de semaine

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

Dimanche première semaine daty

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

1

Essaye ça:

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

ça n'a pas l'air simple pour moi: D et pour aujourd'hui ça me donne 5
B14D3

1

simplifier la solution de Victor Sanchez:

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

remplacez% V par% U si vous voulez des semaines commençant dimanche.

btw: a dû utiliser expr au lieu de $ ((...)) car le dernier ne semble pas aimer les nombres avec des zéros en tête.


0

Si vous acceptez des outils externes dans votre quête, essayez dateutils . Il a la notion de dates d'occurrence dans le mois, c'est-à-dire que le 27 avril 2012 est le 4ème vendredi d'avril 2012, ce qui coïncide juste avec votre définition de semaine. Pour obtenir ce numéro, utilisez:

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

%c(count) est le spécificateur de format pour l'occurrence - dans le mois. Ou pour être encore plus cool, essayez

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.