Cách xác định số tuần trong tháng


10

Trên Linux CLI, có cách nào để lấy số tuần trong tháng không? Có lẽ có một cách khác để có được điều này với một datelệnh (thích ) đơn giản ? Giả sử ngày 1 đến 7 là tuần đầu tiên, ngày 8 đến 14 là tuần thứ hai, v.v.


Làm thế nào để bạn xác định tuần trong tháng? Số ngày chia cho 7 và làm tròn xuống? Số ngày chủ nhật / thứ hai / bất cứ điều gì đã qua?
mgorven

giả sử từ một đến 7 ngày trong tuần đầu tiên của nó, từ 7 đến 14 tuần thứ hai, từ 14 đến 21 thứ ba và từ 21 đến cuối tháng thứ tư của nó. Tôi biết rằng tập lệnh bash đơn giản với date nad nếu là giải pháp tốt cho việc này nhưng tôi tự hỏi liệu tôi có thể di chuyển nó bằng một lệnh mà không thực hiện một tập lệnh nào không.
B14D3

@ B14D3 định nghĩa "tuần của tháng" của bạn khá thô - cụ thể bạn đang sử dụng cái này để làm gì?
voretaq7

1
Không có gì tôi đã đọc người đàn ông cho đến ngày và điều đó xuất hiện trong tâm trí của tôi (Đôi khi tôi có những suy nghĩ ngớ ngẩn). Vì vậy, những gì sẽ là một định nghĩa tốt hơn?
B14D3

Câu trả lời:


21

Các datelệnh không thể làm điều này trong nội bộ, vì vậy bạn cần một số số học bên ngoài.

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

Chỉnh sửa: Đã thêm dấu trừ giữa% và d


Điều đó hoạt động tốt, nhưng tôi không hiểu tại sao số học này trả về số nguyên?
B14D3

2
Bash chỉ làm số học số nguyên.
mgorven

Wow không biết điều đó. Thx: D
B14D3

4
Điều đó đúng - ngày 29+ là vào tuần thứ 5 của tháng.
mgorven

5
Xin lỗi tôi không biết làm thế nào để định dạng bình luận để trông đẹp hơn. Dù sao, ý tưởng tuyệt vời để thực hiện, tuy nhiên nếu ngày là 08 hoặc 09, nó sẽ gây ra lỗi: -bash: (09: giá trị quá lớn cho cơ sở (mã thông báo lỗi là "09"). Đó là vì nếu giá trị số bắt đầu bằng 0 , nó sẽ được đặt tên là số bát phân theo ngôn ngữ C, vì vậy, 08 09 không hợp lệ. Đối với tôi, cách giải quyết là thay đổi từ% d thành% e,% e bỏ qua 0: echo $ (($ (ngày +%) e) -1) / 7 + 1))
Shâu Shắc

2

Bạn có thể sử dụng điều này:

Thứ hai ngày đầu tuần

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

Ngày chủ nhật tuần lễ Firs

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

1

Thử cái này xem sao:

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

không đơn giản đối với tôi: D và hôm nay nó mang lại cho tôi 5
B14D3

1

đơn giản hóa giải pháp của Victor Sanchez:

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

thay thế% V bằng% U nếu bạn muốn tuần bắt đầu vào Chủ nhật.

btw: đã phải sử dụng expr thay vì $ ((...)) vì sau này dường như không thích các số có số 0 đứng đầu.


0

Nếu bạn chấp nhận các công cụ bên ngoài trong nhiệm vụ của mình, hãy thử dateutils . Nó có khái niệm về ngày xuất hiện trong vòng một tháng, tức là ngày 27 tháng 4 năm 2012 là ngày thứ 6 tháng 4 năm 2012, trùng với định nghĩa trong tuần của bạn. Để có được số đó, hãy sử dụng:

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

%c(tính) là công cụ xác định định dạng cho sự xuất hiện - trong tháng. Hoặc để thậm chí mát hơn thử

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.