Cara menentukan jumlah minggu dalam sebulan


10

Di CLI Linux, apakah ada cara untuk mendapatkan nomor minggu dalam sebulan? Mungkin ada cara lain untuk mendapatkan ini dengan satu dateperintah sederhana (seperti )? Katakanlah hari 1 sampai 7 adalah minggu pertama, hari 8 hingga 14 adalah minggu kedua, dan seterusnya.


Bagaimana Anda mendefinisikan minggu dalam sebulan? Jumlah hari dibagi 7 dan dibulatkan ke bawah? Jumlah hari Minggu / Senin / apa pun yang telah berlalu?
mgorven

katakanlah dari satu hingga 7 hari minggu pertama, dari 7 hingga 14 minggu kedua, dari 14 hingga 21 ketiga dan dari 21 hingga akhir bulan minggu keempat. Saya tahu bahwa skrip bash sederhana dengan date nad apakah solusi yang bagus untuk ini tetapi saya bertanya-tanya apakah saya dapat melakukannya dengan satu perintah tanpa melakukan skrip.
B14D3

@ B14D3 definisi "minggu bulan" Anda cukup kasar - untuk apa Anda menggunakan ini?
voretaq7

1
Tanpa alasan saya membaca lelaki untuk kencan dan itu muncul di benak saya (Terkadang saya memiliki pikiran yang sangat konyol). Jadi, apa definisi yang lebih baik?
B14D3

Jawaban:


21

The dateperintah tidak bisa melakukan ini secara internal, sehingga Anda perlu beberapa aritmatika eksternal.

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

Sunting: Menambahkan tanda minus antara% dan d


Itu bekerja dengan baik, tapi saya tidak mengerti mengapa aritmatika ini mengembalikan integer?
B14D3

2
Bash hanya melakukan aritmatika integer.
mgorven

Wow tidak tahu itu. Thx: D
B14D3

4
Itu benar - hari 29+ berada di minggu ke-5 setiap bulan.
mgorven

5
Maaf saya tidak tahu bagaimana memformat komentar agar terlihat lebih bagus. Lagi pula, ide bagus untuk diterapkan, namun jika tanggalnya 08 atau 09, itu akan menyebabkan kesalahan: -bash: (09: nilai terlalu besar untuk basis (token kesalahan adalah "09"). Itu karena jika nilai numerik dimulai dengan 0 , itu akan diintepretasikan sebagai angka oktal oleh bahasa C, jadi 08 09 tidak valid. Bagi saya, solusinya adalah mengubah dari% d menjadi% e,% e menghilangkan 0, echo $ ((($ (tanggal +% yang terkemuka,% e) -1) / 7 +1))
Shâu Shắc

2

Anda bisa menggunakan ini:

Senin Hari minggu pertama

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

Sunday Firs week daty

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

1

Coba ini:

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

tidak terlihat sederhana untuk saya: D dan untuk hari ini memberi saya 5
B14D3

1

menyederhanakan solusi Victor Sanchez:

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

ganti% V dengan% U jika Anda ingin minggu dimulai pada hari Minggu.

btw: harus menggunakan expr daripada $ ((...)) karena nanti sepertinya tidak suka angka dengan nol nol terkemuka.


0

Jika Anda menerima alat eksternal dalam pencarian Anda, coba dateutils . Ada gagasan tentang tanggal kejadian-dalam-bulan, yaitu 27 April 2012 adalah Jumat ke-4 pada April 2012, yang hanya bertepatan dengan definisi minggu Anda. Untuk mendapatkan nomor itu gunakan:

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

%c(Hitung) adalah penentu format untuk kejadian-dalam bulan. Atau untuk menjadi lebih keren, cobalah

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.