Come determinare il numero della settimana del mese


10

Nell'interfaccia della riga di comando di Linux, c'è un modo per ottenere il numero della settimana del mese? Forse c'è un altro modo per ottenerlo con un semplice datecomando (come )? Diciamo che il giorno 1-7 è la prima settimana, il giorno 8-14 è la seconda settimana e così via.


Come definisci la settimana del mese? Il numero del giorno diviso per 7 e arrotondato per difetto? Numero di domeniche / lunedì / qualunque cosa siano passate?
mgorven

diciamo da uno a 7 giorni la prima settimana, da 7 a 14 seconda settimana, da 14 a 21 terzi e da 21 a fine mese la sua quarta settimana. Conosco quel semplice script bash con date nad se è una buona soluzione per questo, ma mi chiedo se posso farlo con un comando senza fare uno script.
B14D3,

@ B14D3 la tua definizione di "settimana del mese" è piuttosto approssimativa - cosa stai usando nello specifico?
voretaq7,

1
Per nulla stavo leggendo l'uomo per data e mi è venuto in mente (a volte ho pensieri così sciocchi). Quindi quale sarà una definizione migliore?
B14D3,

Risposte:


21

Il datecomando non può farlo internamente, quindi è necessario un po 'di aritmetica esterna.

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

Modifica: aggiunto un segno meno tra% e d


Funziona bene, ma non capisco perché questa aritmetica restituisca numeri interi?
B14D3,

2
Bash esegue solo l'aritmetica dei numeri interi.
mgorven

Wow non lo sapeva.
Grazie

4
È corretto: i giorni 29+ sono nella quinta settimana del mese.
mgorven

5
Mi dispiace non so come formattare il commento per apparire più bello. Ad ogni modo, un'ottima idea da implementare, tuttavia se la data è 08 o 09, si verificherà un errore: -bash: (09: valore troppo grande per la base (il token di errore è "09"). Ecco perché se il valore numerico inizia con 0 , verrà interpretato come numero ottale dal linguaggio C, quindi 08 09 non sono validi. Per me, la soluzione alternativa è quella di passare da% d a% e,% e omette lo 0 iniziale: echo $ (((($ (data +% e) -1) / 7 + 1))
Shâu Shắc

2

Puoi usare questo:

Lunedì Primo giorno della settimana

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

Daty della settimana di Sunday Firs

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

1

Prova questo:

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

non sembra semplice per me: D e per oggi mi dà 5
B14D3

1

semplificando la soluzione di Victor Sanchez:

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

sostituisci% V con% U se vuoi settimane a partire da domenica.

btw: ho dovuto usare expr invece di $ ((...)) perché in seguito non sembrano piacere i numeri con zeri iniziali.


0

Se accetti strumenti esterni nella tua ricerca, prova dateutils . Ha la nozione di date di occorrenza entro un mese, cioè il 27 aprile 2012 è il 4 ° venerdì di aprile 2012, che coincide con la definizione della settimana. Per ottenere quel numero usa:

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

%c(conteggio) è l'identificatore di formato per l'occorrenza entro il mese. O per essere ancora più cool, prova

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.