Lệnh ngày đưa ra số tuần sai cho ngày 31 tháng 12


21

Khi tôi cố gắng lấy số tuần cho ngày 31 tháng 12, nó sẽ trả về 1. Khi tôi nhận được số tuần cho ngày 30 tháng 12, tôi nhận được 52 --- đó là những gì tôi mong đợi. Ngày thứ hai là chính xác. Đây là trên một RPI chạy Ubuntu.

$ date -d "2018-12-30T1:58:55" +"%V%a"

52Sun

$ date -d "2018-12-31T1:58:55" +"%V%a"

01Mon

Vấn đề tương tự không có chuỗi thời gian

$ date -d "2018-12-31" +"%V%a"

01Mon

9
"Lệnh ngày đưa ra số tuần sai cho ngày 31 tháng 12" - "Sai" theo thông số kỹ thuật nào? Là thông số kỹ thuật bạn đang sử dụng giống với thông số mà hướng dẫn sử dụng cho datebiết nó đang sử dụng?
Jörg W Mittag


2
Bạn có thể quan tâm Tại sao điều khiển MonthCalWiki hiển thị số tuần sai ở Romania? Bài đăng trên blog là về Windows, nhưng vấn đề đang được thảo luận là chung chung (và dường như giống với những gì bạn đang gặp phải).
một CVn

1
"Máy tính phải sai, vì rõ ràng tôi đã không phạm sai lầm!" nhắc nhở tôi khi tôi phàn nàn rằng trình biên dịch FORTRAN IV phải có lỗi, bởi vì chương trình đơn giản đầu tiên của tôi không thể có bất kỳ lỗi nào ...
RonJohn 17/11/18

Câu trả lời:


49

Điều này mang đến cho bạn tuần ISO bắt đầu vào thứ Hai.

Hệ thống ngày trong tuần ISO thực sự là một hệ thống lịch tuần nhuận, là một phần của tiêu chuẩn ngày và thời gian ISO 8601 do Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) ban hành từ năm 1988 (sửa đổi lần cuối năm 2004) và trước đó, nó đã được xác định trong ISO (R) 2015 kể từ năm 1971. Nó được sử dụng (chủ yếu) trong chính phủ và doanh nghiệp trong các năm tài chính, cũng như trong chấm công. Điều này trước đây được gọi là "mã hóa ngày công nghiệp". Hệ thống chỉ định một năm trong tuần trên lịch Gregorian bằng cách xác định ký hiệu cho các tuần thứ năm trong năm.


Một năm đánh số tuần theo ISO (còn gọi là năm ISO không chính thức) có 52 hoặc 53 tuần đầy đủ. Đó là 364 hoặc 371 ngày thay vì 365 hoặc 365 ngày thông thường. Tuần thêm đôi khi được gọi là tuần nhuận, mặc dù ISO 8601 không sử dụng thuật ngữ này.

Tuần bắt đầu với thứ Hai. Mỗi năm là năm Gregorian trong đó thứ Năm rơi. Tuần đầu tiên của năm, do đó, luôn có ngày 4 tháng 1. Do đó, việc đánh số năm trong tuần theo ISO sẽ hơi lệch so với Gregorian trong một số ngày gần với ngày 1 tháng 1.


Nếu bạn muốn hiển thị 12/12 như tuần 52, bạn nên sử dụng %U, không sử dụng tiêu chuẩn ISO:

$ date -d "2018-12-31T1:58:55" +"%V%a"
01Mon
$ date -d "2018-12-31T1:58:55" +"%U%a"
52Mon

Cảm ơn. Đó là những gì tôi đang tìm kiếm. Tôi đã sử dụng một phương pháp phức tạp hơn nhiều với lệnh cal.
George Shafer

3

Định nghĩa về số tuần là khác nhau giữa Châu Âu và Hoa Kỳ, có thể là ISO so với tiêu chuẩn ANSI. Điều này có thể liên quan đến một tuần là Chủ nhật - Thứ bảy hoặc Thứ hai - Chủ nhật, và điều này một lần nữa có thể liên quan đến định nghĩa của người Do Thái so với Kitô giáo về Ngày của Chúa (Sabbath vs Chủ nhật).

Đối với châu Âu, tuần số 1 chứa thứ Năm đầu tiên vào tháng 1 và do đó, nó chứa tối thiểu 4 ngày (tức là đa số) thuộc về năm mới (Thu-Fri-Sat-Sun).

Dù sao, trong những năm như vậy khi số tuần TẤT CẢ (!!) khác nhau giữa Châu Âu và Hoa Kỳ, điều này mang lại niềm vui lớn với việc đặt lịch trong các công ty đa quốc gia. :-)

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.