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


10

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


Как вы определяете неделю месяца? Номер дня делится на 7 и округляется в меньшую сторону? Количество воскресений / понедельников / что бы ни прошло?
mgorven

скажем, с 1 по 7 день - первая неделя, с 7 до 14 вторая неделя, с 14 до 21 третья и с 21 по конец месяца - четвертая неделя. Я знаю, что простой сценарий bash с датой и надписью является хорошим решением для этого, но мне интересно, могу ли я сделать это с помощью одной команды без выполнения сценария.
B14D3

@ B14D3 ваше определение "недели месяца" довольно грубое - для чего конкретно вы его используете?
voretaq7

1
Я ни за что не читал мужчину на свидание, и это пришло мне в голову (иногда у меня возникают такие глупые мысли). Так что будет лучшим определением?
B14D3

Ответы:


21

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

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

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


Это работает нормально, но я не понимаю, почему эта арифметика возвращает целое число?
B14D3

2
Баш только делает целочисленную арифметику.
mgorven

Вау, не знал этого. Спасибо: D
B14D3

4
Это верно - дни 29+ находятся на 5-й неделе месяца.
mgorven

5
Извините, я не знаю, как отформатировать комментарий, чтобы он выглядел лучше. В любом случае, отличная идея для реализации, однако, если дата 08 или 09, это вызовет ошибку: -bash: (09: слишком большое значение для базы (маркер ошибки "09"). Это потому, что если числовое значение начинается с 0 , он будет интерпретироваться как восьмеричное число языком C, поэтому 08 09 недопустимы. Для меня обходной путь должен измениться с% d на% e,% e опускает ведущий 0: echo $ ((($ (date +% д) -1) / 7 + 1))
Шау Шёк

2

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

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

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) ))

1

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

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

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

1

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

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

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

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


0

Если вы принимаете внешние инструменты в своем квесте, попробуйте 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.