その月の前週の数字が必要です。
3 月の第 2 週の場合、前の週は 1 になります。4 月の第 1 週の場合、前の週は 5 になります。
私の一週間は月曜日から始まります。
WEEK=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))
これから 1 を引いて前の週を取得するにはどうすればよいでしょうか (週が 1 に等しい場合は例外があるため、気にする必要はありません)。
4 週間しかない 2 月が自動的に認識されるのも良いでしょう。
答え1
私が間違っていなければ、あなたの式(ここでは少し再構成されています)は、現在の月の最初の日に対応する週番号と、今日に対応する週番号を見つけ、その差を月の週番号として計算するのでしょうか?
first=$(date -d "-$(($(date +%d)-1)) days")
weekofmon=$(( 1 + $(date +%V) - $(date -d "$first" +%V) ))
それが正しい場合、先週の月間通算週番号が必要な場合は、「今日」を「7 日前」(すべての場所) に置き換えるだけで、その日付に対応する月間通算週番号を取得できるのではないでしょうか。
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) ))
は、date
「7 日前 - 3 日」のような式を解析できることを前提としています。はdate +%V
、先頭にゼロを付けて 10 未満の週番号を出力します。これにより、8 進数として解釈され、08
と が分割されます09
。 を追加して、10#
bash が数値を 10 進数で処理するように強制します。
同じ月の最初の日を取得する少し簡単な方法:
first=$(date -d "$now" +"%Y-%m-01")
(形式は異なりますが、date
解釈できるはずです。)