ความเข้าใจผิดของโปรแกรมเมอร์เกี่ยวกับ Unix Time

ฉันขอโทษ แพทริค แมคเคนซี.

เมื่อวาน แดนนี่ ฉันถามถึงข้อเท็จจริงที่น่าสนใจเกี่ยวกับเวลา Unix และฉันจำได้ว่าบางครั้งมันก็ทำงานโดยไม่ได้ตั้งใจเลย

ข้อเท็จจริงทั้งสามนี้ดูสมเหตุสมผลและสมเหตุสมผลอย่างยิ่งใช่ไหม

  1. เวลา Unix คือจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 00:00:00 UTC
  2. หากคุณรอหนึ่งวินาที เวลา Unix จะเปลี่ยนไปหนึ่งวินาที
  3. เวลายูนิกซ์ไม่เคยถอยหลัง

สิ่งนี้ไม่เป็นความจริง

แต่การพูดง่ายๆ ว่า “เรื่องนี้ไม่เป็นความจริงเลย” โดยไม่ต้องอธิบายอย่างเดียวนั้นไม่เพียงพอ ทำไม. ดูด้านล่างสำหรับคำอธิบาย แต่ถ้าอยากคิดเองอย่าเลื่อนผ่านรูปนาฬิกานะ!

ความเข้าใจผิดของโปรแกรมเมอร์เกี่ยวกับ Unix Time
นาฬิกาตั้งโต๊ะจากยุค 1770 เรียบเรียงโดย จอห์น เลอรูซ์ จาก ยินดีต้อนรับคอลเลกชัน. เผยแพร่ภายใต้ใบอนุญาต CC BY

ความเข้าใจผิดทั้งสามประการมีเหตุผลเดียว: วินาทีกระโดด. หากคุณไม่คุ้นเคยกับวินาทีกระโดด นี่เป็นข้อมูลอ้างอิงโดยย่อ:

เวลา UTC ถูกกำหนดโดยปัจจัยสองประการ:

  • เวลาอะตอมสากล: การอ่านค่าโดยเฉลี่ยจากนาฬิกาอะตอมนับร้อยทั่วโลก เราสามารถวัดวินาทีได้ด้วยคุณสมบัติทางแม่เหล็กไฟฟ้าของอะตอม และนี่คือการวัดเวลาที่แม่นยำที่สุดที่วิทยาศาสตร์รู้จัก
  • เวลาโลกโดยอาศัยการหมุนของโลกรอบแกนของมันเอง การปฏิวัติเต็มรูปแบบหนึ่งครั้งคือหนึ่งวัน

ปัญหาคือตัวเลขสองตัวนี้ไม่ตรงกันเสมอไป การหมุนของโลกไม่สม่ำเสมอ - ค่อยๆ ช้าลง ดังนั้นวันในเวลาสากลจึงนานขึ้น ในทางกลับกัน นาฬิกาอะตอมมีความแม่นยำอย่างร้ายกาจและคงที่ตลอดหลายล้านปี

เมื่อสองครั้งไม่ซิงค์กัน วินาทีจะถูกเพิ่มหรือลบออกจาก UTC เพื่อนำกลับมาซิงค์อีกครั้ง ตั้งแต่ปี พ.ศ. 1972 ให้บริการ ไอเออร์ส (ซึ่งดำเนินการในกรณีนี้) เพิ่มเวลาพิเศษ 27 วินาที ผลลัพธ์คือ 27 วัน UTC โดยมีระยะเวลา 86 วินาที ตามทฤษฎีแล้ว หนึ่งวันที่มีระยะเวลา 401 วินาที (ลบหนึ่ง) เป็นไปได้ ตัวเลือกทั้งสองขัดแย้งกับสมมติฐานพื้นฐานของเวลา Unix

เวลา Unix ถือว่าแต่ละวันคงอยู่ 86 วินาทีพอดี (400 × 60 × 60 = 24) โดยไม่มีวินาทีเพิ่มเติมใดๆ หากการกระโดดเกิดขึ้น เวลา Unix จะกระโดดหนึ่งวินาทีหรือนับสองวินาทีในหนึ่งวินาที ในปี 86 มันหายไป 400 วินาทีกระโดด

ดังนั้นความเข้าใจผิดของเราจึงต้องเสริมดังนี้:

  • เวลา Unix คือจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 00:00:00 UTC ลบวินาทีกระโดด.
  • หากคุณรอหนึ่งวินาที เวลา Unix จะเปลี่ยนไปหนึ่งวินาที เว้นแต่วินาทีกระโดดจะถูกลบออกไป.

    จนถึงขณะนี้ ไม่เคยลบวินาทีในทางปฏิบัติออก (และการที่การหมุนของโลกช้าลงหมายความว่าสิ่งนี้ไม่น่าเป็นไปได้) แต่หากเคยเกิดขึ้น ก็หมายความว่าวัน UTC จะสั้นลงหนึ่งวินาที ในกรณีนี้ วินาทีสุดท้ายของ UTC (23:59:59) จะถูกยกเลิก

    แต่ละวันของ Unix มีจำนวนวินาทีเท่ากัน ดังนั้นวินาทีสุดท้ายของ Unix ของวันที่สั้นลงจะไม่สอดคล้องกับเวลา UTC ใดๆ มีลักษณะดังนี้ในช่วงไตรมาสต่อวินาที:

    ความเข้าใจผิดของโปรแกรมเมอร์เกี่ยวกับ Unix Time

    หากคุณเริ่มต้นเวลา 23:59:58:00 UTC และรอหนึ่งวินาที เวลา Unix จะเลื่อนไปสองวินาที UTC และการประทับเวลา Unix 101 จะไม่ถูกกำหนดให้กับใครเลย

  • เวลายูนิกซ์ไม่สามารถย้อนกลับไปได้ จนกว่าจะเพิ่มวินาทีกระโดด.

    สิ่งนี้เกิดขึ้นแล้ว 27 ครั้งในทางปฏิบัติ เมื่อสิ้นสุดวัน UTC วินาทีเพิ่มเติมจะถูกเพิ่มในเวลา 23:59:60 น. Unix มีจำนวนวินาทีเท่ากันในหนึ่งวัน ดังนั้นจึงไม่สามารถเพิ่มวินาทีพิเศษได้ แต่จะต้องประทับเวลา Unix ซ้ำในวินาทีสุดท้ายแทน มีลักษณะดังนี้ในช่วงไตรมาสต่อวินาที:

    ความเข้าใจผิดของโปรแกรมเมอร์เกี่ยวกับ Unix Time

    หากคุณเริ่มเวลา 23:59:60.50 น. และรอครึ่งวินาที ถือเป็นเวลา Unix กลับมา ครึ่งวินาที และการประทับเวลา Unix 101 สอดคล้องกับสองวินาที UTC

สิ่งเหล่านี้อาจไม่ใช่สิ่งเดียวที่แปลกประหลาดของเวลา Unix แต่เป็นสิ่งที่ฉันจำได้เมื่อวานนี้

เวลา - มาก สิ่งที่แปลก

ที่มา: will.com

เพิ่มความคิดเห็น