Jak ustalić numer tygodnia miesiąca


10

Czy w Linuksowym interfejsie CLI można uzyskać numer tygodnia miesiąca? Może jest inny sposób na uzyskanie tego za pomocą jednego prostego (podobnego date) polecenia? Powiedzmy, że dzień od 1 do 7 to pierwszy tydzień, dzień od 8 do 14 to drugi tydzień i tak dalej.


Jak definiujesz tydzień miesiąca? Liczba dni podzielona przez 7 i zaokrąglona w dół? Liczba niedziel / poniedziałków / cokolwiek minęło?
mgorven

powiedzmy, od jednego do 7 dnia pierwszego tygodnia, od 7 do 14 drugiego tygodnia, od 14 do 21 trzeciego tygodnia, a od 21 do końca miesiąca czwartego tygodnia. Wiem, że ten prosty skrypt bash z datą i if jest dobrym rozwiązaniem, ale zastanawiam się, czy mogę to zrobić za pomocą jednego polecenia bez wykonywania skryptu.
B14D3

@ B14D3 Twoja definicja „tygodnia miesiąca” jest dość gruba - do czego konkretnie tego używasz?
voretaq7

1
Bez powodu czytałem mężczyznę na randkę i to przyszło mi do głowy (czasami mam tak głupie myśli). Więc jaka będzie lepsza definicja?
B14D3

Odpowiedzi:


21

dateKomenda nie może tego zrobić wewnętrznie, więc trzeba trochę arytmetyki zewnętrznego.

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

Edycja: Dodano znak minus między% a d


Działa dobrze, ale nie rozumiem, dlaczego ta arytmetyka zwraca liczbę całkowitą?
B14D3

2
Bash wykonuje tylko arytmetykę liczb całkowitych.
mgorven

Wow tego nie wiedział. Thx: D
B14D3

4
Zgadza się - dni 29+ są w piątym tygodniu miesiąca.
mgorven

5
Niestety nie wiem, jak sformatować komentarz, aby wyglądał ładniej. W każdym razie świetny pomysł na implementację, jednak jeśli data to 08 lub 09, spowoduje błąd: -bash: (09: wartość zbyt duża dla podstawy (token błędu to „09”). Dzieje się tak, ponieważ jeśli wartość liczbowa zaczyna się od 0 , zostanie zinterpretowany jako liczba ósemkowa według języka C. Dlatego 08 09 jest nieprawidłowe. Dla mnie obejściem tego problemu jest zmiana z% d na% e,% e pomija początkowe 0: echo $ ((($ (data +% e) -1) / 7 + 1))
Shâu Shắc

2

Możesz użyć tego:

Poniedziałek Pierwszy dzień tygodnia

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

Niedziela Firs tydzień

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

1

Spróbuj tego:

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

nie wygląda dla mnie prosto: D i na dziś daje mi 5
B14D3

1

uproszczenie rozwiązania Victora Sancheza:

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

zamień% V na% U, jeśli chcesz tygodni zaczynających się w niedzielę.

btw: musiałem użyć wyraż zamiast zamiast $ ((...)), ponieważ później nie wydaje się, aby liczby z wiodącymi zerami nie lubiły.


0

Jeśli w swoim zadaniu akceptujesz narzędzia zewnętrzne, wypróbuj dateutils . Ma pojęcie terminu w ciągu miesiąca, tj. 27 kwietnia 2012 r. Jest czwartym piątkiem w kwietniu 2012 r., Co pokrywa się z definicją tygodnia. Aby uzyskać ten numer, użyj:

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

%c(liczba) to specyfikator formatu dla wystąpienia w ciągu miesiąca. Lub jeszcze fajniej

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.