Як визначити кількість тижня місяця


10

Чи є у CLI Linux спосіб отримання числа тижня місяця? Можливо, є ще один спосіб отримати це за допомогою однієї простої (як date) команди? Скажімо, день 1 - 7 - перший тиждень, день 8 - 14 - другий тиждень тощо.


Як ви визначаєте тиждень місяця? Число дня, поділене на 7 і округлене вниз? Кількість неділь / понеділок / що б не минуло?
mgorven

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

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

1
Не дарма я читав людину на побачення, і це мені прийшло в голову (Іноді в мене такі дурні думки). Отже, що буде кращим визначенням?
B14D3

Відповіді:


21

dateКоманда не може зробити це внутрішньо, так що вам потрібно деяку зовнішню арифметику.

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

Редагувати: Додано знак мінус між% і d


Це добре працює, але я не розумію, чому ця арифметика повертає ціле число?
B14D3

2
Bash виконує лише арифметику з цілим числом.
mgorven

Нічого цього не знав. Thx: D
B14D3

4
Це правильно - дні 29+ перебувають у 5-му тижні місяця.
mgorven

5
Вибачте, я не знаю, як відформатувати коментар, щоб виглядати приємніше. У будь-якому випадку, відмінна ідея для впровадження, але якщо дата - 08 або 09, це призведе до помилки: -bash: (09: значення занадто велике для бази (маркер помилки - "09"). Це тому, що якщо числове значення починається з 0 , вона буде сприйнята як вісімковий номер мовою C, тому 08 09 є недійсним. Для мене спосіб вирішення полягає у зміні від% d до% e,% e опускає провідний 0: echo $ ((($ (дата +% д) -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

Якщо ви приймаєте зовнішні інструменти у своїх пошуках, спробуйте датиutils . У нього з'явилося поняття дат, що відбуваються протягом місяця, тобто 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.