Вопрос: Как определить количество недель месяца


В CLI Linux есть способ получить номер недели месяца? Возможно, есть еще один способ получить это с помощью простого (например, date) команда? Предположим, что день с 1 по 7 - это первая неделя, 8-14 день - вторая неделя и т. Д.


9
2018-04-27 05:21


Источник


Как вы определяете неделю месяца? Номер дня, деленный на 7 и округленный? Количество воскресений / понедельников / все, что прошло? - mgorven
скажем, от одного до семи дней его 1-й недели, от 7 до 14 второй недели, от 14 до 21 третьей и от 21 до конца месяца - четвертой недели. Я знаю, что простой скрипт bash с датой nad, если это хорошее решение для этого, но им интересно, могу ли я это сделать с помощью одной команды без выполнения сценария. - B14D3
@ B14D3 определение «неделя месяца» довольно грубое - что конкретно вы используете для этого? - voretaq7
Ни за что я читал человека на свидание, и это пришло мне в голову (иногда у меня такие глупые мысли). Так что будет лучшим определением? - B14D3


Ответы:


date команда не может сделать это внутренне, поэтому вам нужна внешняя арифметика.

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

Изменить: добавлен знак минуса между% и d


19
2018-04-27 05:38



Это хорошо работает, но я не понимаю, почему эта арифметика возвращает целое число? - B14D3
Bash только выполняет целочисленную арифметику. - mgorven
Вау этого не знал. Thx: D - B14D3
Правильно - дни 29+ находятся на пятой неделе месяца. - mgorven
Извините, я не знаю, как отформатировать комментарий, чтобы выглядеть лучше. В любом случае, отличная идея реализовать, однако, если дата 08 или 09, это вызовет ошибку: -bash: (09: слишком большое значение для базы (токен ошибки - «09»). Это потому, что если числовое значение начинается с 0 , он будет проиндексирован как восьмеричное число с помощью языка C, поэтому 08 09 недействительны. Для меня обходной путь заключается в изменении от% d до% e,% e опускает ведущее 0: echo $ ((($ (date +%) е) -1) / 7 + 1)) - Shâu Shắc


Вы можете использовать это:

Понедельник Первый день недели

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

Воскресенье

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

2
2017-12-28 13:17





Попробуй это:

d=`date +%d` ; m=`date +%m` ; y=`date +%Y` ; cal $m $y | sed -n "3,$ p" | sed -n "/$d/{=;q;}"

1
2018-04-27 05:32



для меня не выглядит просто: D и на сегодня это дает мне 5 - B14D3


Если вы принимаете внешние инструменты в своем квете, попробуйте dateutils, У него есть представление о дате появления в течение месяца, т. Е. 27 апреля 2012 года - четвертое пт в апреле 2012 года, которое просто совпадает с определением вашей недели. Чтобы использовать этот номер:

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

%c (count) - спецификатор формата для события - в течение месяца. Или, чтобы быть еще холоднее, попробуйте

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

0
2017-09-05 14:04





упрощая решение Виктора Санчеса:

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

замените% V на% U, если вы хотите, чтобы недели начинались в воскресенье.

btw: пришлось использовать expr вместо $ ((...)), потому что позже не похоже на числа с ведущими нулями.


0
2017-07-04 15:47