เหตุใดจึงเป็นวันที่จาก 1600s เป็นไปได้?
Windows ไม่เก็บ timestamps ไฟล์มีการแก้ไขเช่นระบบปฏิบัติการ Unix ทำ ตามWindows Dev Center (เหมืองเน้น):
เวลาไฟล์คือค่า 64- บิตที่แทนจำนวนช่วงเวลา 100 นาโนวินาทีที่ผ่านไปตั้งแต่ 12:00 AM วันที่ 1 มกราคม 1601 Coordinated Universal Time (UTC) ระบบบันทึกเวลาไฟล์เมื่อแอปพลิเคชั่นสร้างเข้าถึงและเขียนลงไฟล์
ดังนั้นด้วยการตั้งค่าผิดที่นี่คุณสามารถรับวันที่จาก 1600s
แน่นอนคำถามสำคัญอีกข้อหนึ่งคือ: ชุดนี้มีค่าอย่างไร? วันที่แท้จริงคืออะไร? ฉันคิดว่าคุณจะไม่สามารถหาคำตอบได้เนื่องจากเป็นข้อผิดพลาดในการคำนวณในไดรเวอร์ระบบไฟล์ คำตอบอีกข้อหนึ่งตั้งสมมติฐานว่าวันที่นี้เป็นจริงของการประทับเวลา Unix ตีความว่าเป็นการประทับเวลาของ Windows แต่จริง ๆ แล้วพวกเขาจะคำนวณตามช่วงเวลาที่แตกต่างกัน (วินาทีกับ nanoseconds)
สิ่งนี้เกี่ยวข้องกับปัญหาปี 2038 อย่างไร
การใช้ชนิดข้อมูล 64 บิตหมายความว่า Windows (โดยทั่วไป) ไม่ได้รับผลกระทบจากปัญหาปี 2038ที่ระบบ Unix ดั้งเดิมมีเนื่องจาก Unix เริ่มใช้จำนวนเต็ม 32 บิตซึ่งล้นเร็วกว่าจำนวนเต็ม 64 บิตที่ Windows มี (นี่คือแม้ Unix ปฏิบัติการในไม่กี่วินาทีและ Windows ทำงานบนไมโคร / nanoseconds.)
Windows ยังคงได้รับผลกระทบเมื่อใช้โปรแกรม 32 บิตที่คอมไพล์ด้วย Visual Studio เวอร์ชันเก่าแน่นอน
ระบบปฏิบัติการ Unix รุ่นใหม่ได้ขยายประเภทข้อมูลไปเป็น 64 บิตแล้วจึงหลีกเลี่ยงปัญหานี้ได้ (อันที่จริงแล้วเนื่องจากการประทับเวลาของ Unix ทำงานในไม่กี่วินาทีวันที่ขึ้นใหม่จะอยู่ที่ 292 พันล้านปีจากนี้)
วันที่สูงสุดที่สามารถตั้งค่าคืออะไร?
สำหรับคนที่อยากรู้อยากเห็น - นี่คือวิธีการคำนวณ:
- จำนวนของค่าที่เป็นไปได้ในจำนวนเต็ม 64 บิตเป็น2 63 - 1 n = 9223372036854775807
- แต่ละเห็บหมายถึง 100 นาโนวินาทีซึ่งก็คือ 0.1 µs หรือ 0.0000001 s
- ช่วงเวลาสูงสุดจะเป็น9223372036854775807 ⨉ 0.0000001 sดังนั้นหลายร้อยพันล้านวินาที
- หนึ่งชั่วโมงมี 3600 วินาทีหนึ่งวันมี 86400 วินาทีและหนึ่งปีมี 365 วันดังนั้นมี86400 ⨉ 365 s = 31536000 sในหนึ่งปี แน่นอนนี่เป็นเพียงค่าเฉลี่ยไม่สนใจปีอธิกสุรทินวินาทีอธิกวินาทีหรือการเปลี่ยนแปลงปฏิทินใด ๆ ที่ระบอบ postapocalyptic ในอนาคตอาจกำหนดบนพื้นดินที่เหลือ
- 9223372036854775807 ⨉ 0.0000001 s / 31536000 s ≈ 29247 ปี
@corsiKa
อธิบายวิธีที่เราสามารถลบการก้าวกระโดดปี: 29247/365/4 ≈ 20
- ดังนั้นปีสูงสุดของคุณคือ1601 + 29247-20 = 30828
บางคนพยายามที่จะตั้งค่านี้และเกิดขึ้นในปีเดียวกัน