Получить номер предыдущей недели в bash

Получить номер предыдущей недели в bash

Мне нужен номер предыдущей недели месяца.

Во 2-ю неделю марта предыдущая неделя будет 1. В 1-ю неделю апреля предыдущая неделя будет 5.

Моя неделя начинается с понедельника.

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

Как мне вычесть из этого один, чтобы получить предыдущую неделю (если неделя равна 1, у меня есть исключение, поэтому мне не нужно об этом беспокоиться).

Было бы также неплохо, если бы февраль, в котором всего 4 недели, распознавался автоматически.

решение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 с ведущим нулем, что привело бы к их интерпретации как восьмеричных чисел, нарушая 08и 09. Добавьте , 10#чтобы заставить bash принимать числа в десятичном виде.

Немного более короткий способ получить первый день того же месяца:

first=$(date -d "$now" +"%Y-%m-01") 

(другой формат, но dateего можно интерпретировать.)

Связанный контент