วิธีกำหนดจำนวนสัปดาห์ของเดือน


10

บน Linux CLI มีวิธีรับจำนวนสัปดาห์ของเดือนหรือไม่ อาจมีวิธีอื่นในการรับสิ่งนี้ด้วยdateคำสั่งง่ายๆ (เหมือน)? สมมติว่าวันที่ 1 ถึง 7 เป็นสัปดาห์แรกวันที่ 8 ถึง 14 คือสัปดาห์ที่สองเป็นต้น


คุณจะกำหนดสัปดาห์ของเดือนได้อย่างไร จำนวนวันหารด้วย 7 แล้วปัดเศษลง? จำนวนวันอาทิตย์ / วันจันทร์ / อะไรที่ผ่านไป?
mgorven

ให้พูดจากหนึ่งถึง 7 วันในสัปดาห์ที่ 1 ของมันจาก 7 ถึง 14 สัปดาห์ที่สองจาก 14 ถึง 21 ที่สามและจาก 21 ถึงสิ้นเดือนในสัปดาห์ที่สี่ ฉันรู้ว่าสคริปต์ทุบตีง่าย ๆ กับ date nad ถ้าเป็นทางออกที่ดีสำหรับเรื่องนี้ แต่ฉันสงสัยว่าฉันสามารถ di นั้นด้วยคำสั่งเดียวโดยไม่ต้องทำสคริปต์
B14D3

@ B14D3 คำนิยาม "สัปดาห์ของเดือน" ของคุณค่อนข้างหยาบ - คุณใช้สิ่งนี้เพื่ออะไรโดยเฉพาะ
voretaq7

1
สำหรับอะไรที่ฉันกำลังอ่านคนสำหรับวันที่และที่มาถึงใจของฉัน (บางครั้งฉันมีความคิดที่โง่มาก) ดังนั้นสิ่งที่จะเป็นคำจำกัดความที่ดีกว่า
B14D3

คำตอบ:


21

dateคำสั่งไม่สามารถทำเช่นนี้ภายในดังนั้นคุณจึงจำเป็นบางเลขคณิตภายนอก

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

แก้ไข: เพิ่มเครื่องหมายลบระหว่าง% และ d


มันใช้งานได้ดี แต่ฉันไม่เข้าใจว่าทำไมเลขคณิตนี้ถึงคืนจำนวนเต็ม?
B14D3

2
Bash ทำเลขจำนวนเต็มเท่านั้น
mgorven

ว้าวไม่รู้เช่นนั้น ขอบคุณ: D
B14D3

4
ถูกต้อง - วันที่ 29+ อยู่ในสัปดาห์ที่ 5 ของเดือน
mgorven

5
ขออภัยฉันไม่รู้วิธีจัดรูปแบบความคิดเห็นเพื่อให้ดูดีขึ้น อย่างไรก็ตามความคิดที่ดีที่จะใช้อย่างไรก็ตามถ้าวันที่ 08 หรือ 09 มันจะทำให้เกิดข้อผิดพลาด: -bash: (09: ค่ามากเกินไปสำหรับฐาน (โทเค็นข้อผิดพลาดคือ "09") นั่นเป็นเพราะถ้าค่าตัวเลขเริ่มต้นด้วย 0 มันจะถูก intepreted เป็นเลขฐานแปดโดยภาษา C ดังนั้น 08 09 จึงไม่ถูกต้องสำหรับฉันการแก้ปัญหาคือเปลี่ยนจาก% d เป็น% e,% e ละเว้น 0: echo $ (($ (วันที่ +%% e) -1) / 7 + 1))
ShâuShắc

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

ลดความซับซ้อนโซลูชันของ Victor Sanchez:

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

แทนที่% V ด้วย% U หากคุณต้องการให้สัปดาห์เริ่มต้นในวันอาทิตย์

btw: ต้องใช้ expr แทน $ ((... )) เพราะในภายหลังดูเหมือนจะไม่ชอบตัวเลขที่มีเลขศูนย์นำหน้า


0

ถ้าคุณยอมรับเครื่องมือภายนอกในการแสวงหาของคุณลองdateutils มันเป็นความคิดของวันที่เกิดขึ้น - ภายในเดือนเช่น 27 เมษายน 2012 คือวันศุกร์ที่ 4 ในเดือนเมษายน 2012 ซึ่งเพิ่งตรงกับคำนิยามสัปดาห์ของคุณ ในการรับหมายเลขนั้นให้ใช้:

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

%c(นับ) เป็นตัวระบุรูปแบบสำหรับการเกิดขึ้นภายในเดือน หรือจะลองให้เย็นกว่านี้

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.