วันที่คำสั่งให้ผิดหมายเลขสัปดาห์สำหรับ 31 ธันวาคม


21

เมื่อฉันพยายามรับหมายเลขสัปดาห์สำหรับวันที่ 31 ธันวาคมมันจะกลับมา 1 เมื่อฉันได้รับหมายเลขสัปดาห์สำหรับวันที่ 30 ธันวาคมฉันจะได้ 52 - ซึ่งเป็นสิ่งที่ฉันคาดหวัง วันจันทร์ถูกต้อง นี่คือ RPI ที่ใช้งาน Ubuntu

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

52Sun

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

01Mon

ปัญหาเดียวกันโดยไม่มีสตริงเวลา

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

01Mon

9
"วันที่คำสั่งให้หมายเลขสัปดาห์ที่ไม่ถูกต้องสำหรับวันที่ 31 ธันวาคม" - "ผิด" ตามข้อกำหนดที่กำหนด? สเปคที่คุณใช้นั้นเป็นแบบเดียวกันกับที่ใช้สำหรับdateบอกว่ามันใช้หรือไม่?
Jörg W Mittag


2
คุณอาจสนใจทำไมการควบคุม MonthCalendar จึงแสดงตัวเลขสัปดาห์ที่ไม่ถูกต้องในโรมาเนีย โพสต์บล็อกเป็นเรื่องเกี่ยวกับ Windows แต่ปัญหาที่กล่าวถึงนั้นเป็นเรื่องทั่วไป (และดูเหมือนจะเหมือนกับสิ่งที่คุณกำลังเผชิญอยู่)
CVn

1
"คอมพิวเตอร์ต้องผิดเพราะเห็นได้ชัดว่าฉันไม่ได้ทำผิด!" เตือนฉันเมื่อฉันบ่นว่าคอมไพเลอร์ FORTRAN IV จะต้องมีข้อผิดพลาดเพราะโปรแกรมที่เรียบง่ายครั้งแรกของฉันไม่สามารถมีข้อผิดพลาดใด ๆ ...
RonJohn

คำตอบ:


49

นี่คือการให้ ISO สัปดาห์ของคุณซึ่งจะเริ่มในวันจันทร์

ระบบวันสัปดาห์ ISO เป็นระบบปฏิทินสัปดาห์กระโดดอย่างมีประสิทธิภาพซึ่งเป็นส่วนหนึ่งของมาตรฐาน ISO 8601 วันที่และเวลาที่ออกโดยองค์การระหว่างประเทศเพื่อการมาตรฐาน (ISO) ตั้งแต่ปี 1988 (แก้ไขครั้งสุดท้ายในปี 2004) และก่อนหน้านั้นกำหนดไว้ใน ISO (R) 2015 ตั้งแต่ปี 1971 มีการใช้ (ส่วนใหญ่) ในภาครัฐและธุรกิจสำหรับปีงบการเงินรวมถึงในการจับเวลา ก่อนหน้านี้เป็นที่รู้จักกันในชื่อ "รหัสอุตสาหกรรมวันที่" ระบบจะระบุปีของสัปดาห์บนยอดปฏิทินเกรกอเรียนโดยกำหนดสัญกรณ์สำหรับสัปดาห์อันดับของปี


ปีที่หมายเลขสัปดาห์ของ ISO (หรือเรียกอีกอย่างว่าปี ISO อย่างไม่เป็นทางการ) มี 52 หรือ 53 สัปดาห์เต็ม นั่นคือ 364 หรือ 371 วันแทนที่จะเป็น 365 หรือ 366 วันปกติ บางครั้งอาจมีการเรียกสัปดาห์เพิ่มเติมเป็นสัปดาห์กระโดดแม้ว่า ISO 8601 จะไม่ใช้คำนี้

สัปดาห์เริ่มต้นด้วยวันจันทร์ แต่ละสัปดาห์ของปีคือปีเกรกอเรียนที่วันพฤหัสบดีตก ดังนั้นสัปดาห์แรกของปีจึงมี 4 มกราคมเสมอ การกำหนดหมายเลข ISO ของสัปดาห์ในสัปดาห์จึงเบี่ยงเบนจากคริสต์ศักราชเล็กน้อยสำหรับบางวันใกล้กับ 1 มกราคม


หากคุณต้องการแสดง 12/31 เป็น 52 สัปดาห์คุณควรใช้%Uซึ่งไม่ได้ใช้มาตรฐาน ISO:

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

ขอบคุณ นั่นคือสิ่งที่ฉันกำลังมองหา ฉันใช้วิธีการที่ซับซ้อนมากขึ้นด้วยคำสั่ง cal
George Shafer

3

คำนิยามของหมายเลขสัปดาห์นั้นแตกต่างกันระหว่างยุโรปและสหรัฐอเมริกาซึ่งอาจเป็น ISO และมาตรฐาน ANSI นี่อาจเกี่ยวข้องกับสัปดาห์ที่เป็นวันอาทิตย์ - วันเสาร์หรือวันจันทร์ - วันอาทิตย์และสิ่งนี้อาจเกี่ยวข้องกับคำนิยามของชาวยิวและคริสเตียนในวันของพระเจ้า (วันสะบาโต vs วันอาทิตย์)

สำหรับยุโรปสัปดาห์ที่ 1 ประกอบด้วยวันพฤหัสบดีแรกของเดือนมกราคมและจะมีอย่างน้อย 4 วัน (เช่นเสียงส่วนใหญ่) ที่เป็นของปีใหม่ (พฤหัสบดี - ศุกร์ - เสาร์ - อาทิตย์)

อย่างไรก็ตามในปีที่ผ่านมาเมื่อตัวเลขในสัปดาห์ทั้งหมด (!!) มี +/- 1 ที่แตกต่างกันระหว่างยุโรปและสหรัฐอเมริกาสิ่งนี้ให้ความสนุกสนานอย่างมากกับการกำหนดตารางเวลาใน บริษัท ข้ามชาติ :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.