So bestimmen Sie die Anzahl der Wochen im Monat

10

Gibt es in der Linux-CLI eine Möglichkeit, die Nummer der Woche des Monats abzurufen? Vielleicht gibt es einen anderen Weg, dies mit einem einfachen (ähnlichen date) Befehl zu erreichen? Angenommen, Tag 1 bis 7 ist die erste Woche, Tag 8 bis 14 ist die zweite Woche und so weiter.

B14D3
quelle
Wie definieren Sie die Woche des Monats? Die Tageszahl geteilt durch 7 und abgerundet? Anzahl der Sonntage / Montage / was auch immer vergangen sind?
mgorven
Nehmen wir an, von einem bis sieben Tagen in der ersten Woche, von 7 bis 14 in der zweiten Woche, von 14 bis 21 in der dritten und von 21 bis zum Monatsende in der vierten Woche. Ich kenne dieses einfache Bash-Skript mit Datum und wenn es eine gute Lösung dafür ist, aber ich frage mich, ob ich das mit einem Befehl tun kann, ohne ein Skript zu machen.
B14D3
@ B14D3 Ihre Definition "Woche des Monats" ist ziemlich grob - wofür verwenden Sie diese konkret?
voretaq7
1
Für nichts las ich Mann für Datum und das kam mir in den Sinn (Manchmal habe ich so dumme Gedanken). Was wird also eine bessere Definition sein?
B14D3

Antworten:

21

Der dateBefehl kann dies nicht intern ausführen, daher benötigen Sie eine externe Arithmetik.

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

Bearbeiten: Ein Minuszeichen zwischen% und d wurde hinzugefügt

mgorven
quelle
Das funktioniert gut, aber ich verstehe nicht, warum diese Arithmetik eine ganze Zahl zurückgibt?
B14D3
2
Bash rechnet nur ganzzahlig.
mgorven
Wow wusste das nicht. Thx: D
B14D3
4
Das ist richtig - Tage 29+ sind in der 5. Woche des Monats.
mgorven
5
Entschuldigung, ich weiß nicht, wie ich den Kommentar formatieren soll, um besser auszusehen. Wie auch immer, eine gute Idee zu implementieren, aber wenn das Datum 08 oder 09 ist, wird es Fehler verursachen: -bash: (09: Wert zu groß für Basis (Fehler-Token ist "09"). Das liegt daran, wenn der numerische Wert mit 0 beginnt wird es von der C-Sprache als Oktalzahl interpretiert, daher ist 08 09 ungültig. Für mich besteht die Problemumgehung darin, von% d nach% e zu wechseln.% e lässt die führende 0 weg: echo $ ((($ (Datum +%)) e) -1) / 7 + 1))
Shâu Shắc
2

Sie können dies verwenden:

Montag Erster Wochentag

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

Sonntag Firs Woche Datum

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

Versuche dies:

d=`date +%d` ; m=`date +%m` ; y=`date +%Y` ; cal $m $y | sed -n "3,$ p" | sed -n "/$d/{=;q;}"
Ruy Rocha
quelle
sieht für mich nicht einfach aus: D und für heute gibt es mir 5
B14D3
1

Vereinfachung der Lösung von Victor Sanchez:

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

Ersetzen Sie% V durch% U, wenn Sie Wochen ab Sonntag wünschen.

Übrigens: musste expr anstelle von $ ((...)) verwenden, da letzterer Zahlen mit führenden Nullen nicht zu mögen scheint.

faccenda
quelle
0

Wenn Sie externe Tools für Ihre Suche akzeptieren, versuchen Sie es mit dateutils . Es hat den Begriff des Auftretens innerhalb eines Monats, dh der 27. April 2012 ist der 4. Fr im April 2012, was nur mit Ihrer Wochendefinition übereinstimmt. Um diese Nummer zu erhalten, verwenden Sie:

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

%c(count) ist der Formatbezeichner für das Auftreten innerhalb eines Monats. Oder um noch cooler zu sein

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
hroptatyr
quelle