Мне нужен номер предыдущей недели месяца.
Во 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
его можно интерпретировать.)