Ich brauche die Nummer der Vorwoche des Monats.
In der 2. Märzwoche wäre die vorherige Woche die 1. In der 1. Aprilwoche wäre die vorherige Woche die 5.
Meine Woche beginnt mit Montag.
WEEK=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))
Wie kann ich davon eins abziehen, damit ich die vorherige Woche erhalte (wenn die Woche 1 ergibt, besteht eine Ausnahme, dann muss ich mir darüber keine Gedanken machen).
Schön wäre auch, wenn der Februar mit nur 4 Wochen automatisch erkannt würde.
Antwort1
Wenn ich mich nicht irre, findet Ihr Ausdruck (hier etwas umorganisiert) die Wochennummer, die dem ersten Tag des aktuellen Monats entspricht, die Wochennummer, die dem heutigen Tag entspricht, und berechnet die Differenz als Woche des Monats?
first=$(date -d "-$(($(date +%d)-1)) days")
weekofmon=$(( 1 + $(date +%V) - $(date -d "$first" +%V) ))
Wenn das richtig ist und Sie die Wochentage der letzten Woche möchten, sollte es dann nicht ausreichen, einfach „heute“ durch „vor 7 Tagen“ (an allen Stellen) zu ersetzen, um den Wochenmonat zu erhalten, der diesem Datum entspricht?
now="7 days ago"
first=$(date -d "$now - $(($(date +%d -d "$now" )-1)) days")
weekofmon=$(( 1 + 10#$(date +%V -d "$now") - 10#$(date -d "$first" +%V) ))
Dies beruht auf date
der Fähigkeit, Ausdrücke wie „vor 7 Tagen – 3 Tagen“ zu analysieren. date +%V
druckt Wochenzahlen < 10 mit einer führenden Null, was dazu führen würde, dass sie als Oktalzahlen interpretiert werden, was zu einem Umbruch 08
und führt 09
. Fügen Sie hinzu, 10#
um Bash zu zwingen, die Zahlen als Dezimalzahlen anzunehmen.
Ein etwas kürzerer Weg, um den ersten Tag des gleichen Monats zu erhalten:
first=$(date -d "$now" +"%Y-%m-01")
(anderes Format, date
sollte aber interpretierbar sein.)