Làm thế nào để sử dụng lệnh date để tìm ra ngày nào vào thứ hai tuần thứ 40 40?


11

Làm cách nào tôi có thể sử dụng lệnh date để chuyển đổi thứ gì đó như "thứ hai tuần 40" thành ngày ISO?

Tôi đang chơi với một cái gì đó như thế này:

date --date='monday week 40' +'%Y-%m-%d'

Và ngày tôi đang tìm kiếm sẽ là 2011-10-03.

Nhưng vấn đề của tôi là chuỗi ngày này không hợp lệ, vì vậy tôi cần một cách tiếp cận khác để giải quyết vấn đề này.

/Cảm ơn


Liên kết sau đây là về những gì xác định vào ngày nào trong năm một tuần được đánh số bắt đầu. Đánh số tuần (Wikipedia) .. Nó giải thích một cách hiệu quả tại sao ngày 1 tháng 1 năm nay là vào tuần ISO 52 .. %VTrình tự định dạng được sử dụng bởi 'người dùng không xác định' báo cáo số tuần ISO.
Peter.O

Câu trả lời:


4

Thực sự xấu xí và có lẽ chỉ hoạt động với GNU date:

date -d "$( date -d "$( date +'%Y-01-01' ) +40 weeks") -$( date -d "$( date +'%Y-01-01' ) +40 weeks" +'%w' ) days+1 day" +'%Y-%m-%d'

Chỉ được thử nghiệm cho ví dụ ngày 3 tháng 10 của bạn, có thể thất bại đối với một số trường hợp khác.


Cập nhật : Nếu bạn có một miền địa phương, bạn cần chỉ định đầu ra từ ngày bên trong để đi làm. (Và% F chỉ là YYYY-MM-DD).

date -d "$(date -d "$(date +'%Y-01-01') +40 weeks" +"%F") -$(date -d "$(date +'%Y-01-01') +40 weeks" +%w) days +1 day" +"%F"

1
Bạn đã bỏ lỡ định dạng đầu ra từ ngày bên trong để bên ngoài có thể sử dụng chính xác.
Johan

@Johan, tôi không có vấn đề gì với việc sử dụng định dạng mặc định. Có lẽ đó là địa phương cụ thể? Tôi sử dụng en_US. Điểm tốt nào.
manatwork

Đối với ngày tôi sử dụng ngôn ngữ Thụy Điển, vì vậy có sự khác biệt.
Johan

Cảm ơn đã điều chỉnh miền địa phương. Tôi có một định dạng ngày tùy chỉnh và có cùng một vấn đề .. Tôi gần như đã sắp xếp nó ra, nhưng bây giờ bạn đã đăng nó tôi sẽ sử dụng tinh chỉnh của bạn; thế tốt hơn rồi.
Peter.O

Không có yêu cầu cho điều này là một lót. Sẽ tốt hơn nếu chia phần này thành nhiều dòng, sử dụng các biến tạm thời với tên mô tả để làm rõ cách thức hoạt động của nó. Nó cũng giả định rằng ngày 1 tháng 1 ở cùng số tuần mỗi năm, đây không phải là trường hợp như đã được ghi nhận bởi @ Peter.O.
Adam Spiers

5

Một cách tiếp cận khác:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40 là tuần bạn tìm kiếm
  • ngày +% V trả về tuần hiện tại (35)
  • 40-35 = 5, là số tuần cần thêm
  • từ đó, tìm kiếm thứ hai

tốt, và nó hoạt động với cài đặt ngày tùy chỉnh của tôi.
Peter.O

Đây là một ý tưởng thông minh, nhưng nó không hoạt động. Ví dụ: nếu hôm nay là thứ Hai trong tuần 41 (tức là date +%Vtrả về 41), thì --dategiá trị tham số sẽ là +-1weeks last monday, thực sự là một hai tuần trước, không phải 7 ngày trước.
Adam Spiers

Tôi không chắc liệu tôi có hiểu bài phê bình của bạn không. Đó là năm 2013, vì vậy ví dụ từ câu hỏi không phù hợp. Điều gì sẽ là ngày tuyệt đối cho câu hỏi và cách tiếp cận của tôi trở lại thay vào đó (có thể: tại sao)?
người dùng không xác định

@AdamSpiers: Lịch của tôi hiển thị là Thứ Hai, tuần 40 ngày 30 tháng Chín, đó là những gì mà thuật toán của tôi mang lại (hôm nay).
người dùng không xác định

@userunknown Đó là vì bạn đang kiểm tra mã của mình hôm nay, thứ ba, đến sau thứ Hai. Nếu bạn đã kiểm tra mã của mình ngày hôm qua, nó sẽ bị hỏng. Để làm cho nó rõ ràng hơn, hãy thử chạy date -d 'last monday'. Nó sẽ trở lại vào ngày hôm qua. Bạn nghĩ nó sẽ nói gì nếu bạn đã chạy nó ngày hôm qua?
Adam Spiers

1

OK, đây là nỗ lực của tôi. Nó đánh cắp ý tưởng từ các câu trả lời khác và cố gắng làm cho logic dễ theo dõi hơn. Điều này dựa trên hệ thống ISO 8601, vì vậy sẽ không chính xác nếu bạn sống ở các quốc gia như Hoa Kỳ hoặc Canada, nhưng có thể dễ dàng điều chỉnh cho các quốc gia đó.

# sets $week_start to a representation of Monday of the given week
# number formatted via the given format, and similarly sets
# $week_end to Friday of the same week.
get_week_range () {
    week_num="$1" date_format="$2"

    # Most of the world adhere to ISO 8601 which states that weeks begin on Monday
    # and Jan 4th is always in week #1:
    #
    #   http://en.wikipedia.org/wiki/ISO_week_date
    #
    # For other week numbering systems (e.g. USA, Canada), see:
    #
    #   http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
    day_in_week_1=$( date +'%Y-01-04' )
    day_num_in_week_1=$( date -d $day_in_week_1 +%u ) # 1 is Monday
    days_from_week_1_start=$(( $day_num_in_week_1 - 1 ))
    # This is a Monday:
    start_of_week_1=$( date -d "$day_in_week_1 - $days_from_week_1_start days" +%F )

    week_delta="$(( $week_num - 1 ))"
    # Monday:
    week_start=$( date -d "$start_of_week_1 + $week_delta weeks"          +"$date_format" )
    # Friday:
    week_end=$(   date -d "$start_of_week_1 + $week_delta weeks + 4 days" +"$date_format" )
}
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.