Bash - date ทำงานกับบั๊ก 2038 บนระบบ 32 บิต LINUX


9

ผมเขียนสคริปต์ทุบตีเล็ก ๆ น้อย ๆ ที่ทำให้ฉันสะดุดข้าม"ปี 2038 แมลง" ฉันไม่ทราบเกี่ยวกับปัญหานี้มาก่อนและฉันก็กล้าโพสต์--debugผลลัพธ์ที่ฉันได้รับdateเมื่อสคริปต์ของฉันพยายามคำนวณข้ามวันเวทย์มนตร์นี้ (03:14:07 UTC วันที่ 19 มกราคม 2038)

date -d "20380119"

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' = 2147468400 epoch-seconds
date: output timezone: +01:00 (set from system default)
date: final: 2147468400.000000000 (epoch-seconds)
date: final: (Y-M-D) 2038-01-18 23:00:00 (UTC0)
date: final: (Y-M-D) 2038-01-19 00:00:00 (output timezone TZ=+01:00)
Tue Jan 19 00:00:00 CET 2038

date -d "20380119 + 1 days"

date: parsed hybrid part: +1 day(s)
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: warning: when adding relative days, it is recommended to specify 12:00pm
date: error: adding relative date resulted in an invalid date: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: invalid date '20380119 + 1 days'

date -d "20380120" --debug

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: error: invalid date/time value:
date:     user provided time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date:        normalized time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: 
date:      possible reasons:
date:        numeric values overflow;
date:        missing timezone
date: invalid date '20380120'

มีวิธีใดที่จะทำให้ GNU dateคำนวณตลอดวันนี้
(บนระบบ LINUX 32 บิต)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86

3
วิธีหนึ่งในการรับไปใช้กับระบบ 32 บิตคือการใช้ * BSD OS
Rui F Ribeiro

1
ไม่ใช่ทุบตี แต่: search.cpan.org/~mschwern/Time-y2038-20100403/lib/Time/y2038.pm
jesse_b

1
@ Kusalananda ขอโทษที่ไม่ชัดเจน ใช่ฉันถามเกี่ยวกับวิธีการที่ dateGNU ฉันจะแก้ไขคำถามของฉัน ...
nath

FWIW, OpenBSD คงที่ในปี 2014 มันทำงานได้มาก แต่อย่างใดพวกเขาจัดการแก้ไขบิตที่เกี่ยวข้องทั้งหมด
Satō Katsura

คำตอบ:


14

หากคุณต้องการติดกับ GNU dateบน Linux แบบ 32 บิตไม่มีวิธีที่ง่ายที่จะให้มันทำงานกับเดทหลังจากปี 2581 ผู้coreutilsดูแลระบบไม่พิจารณาcoreutilsข้อผิดพลาดนี้ดังนั้นอย่าคาดหวังว่าจะมีการแก้ไขที่นี่ มาจากไลบรารี Cและเคอร์เนล หากคุณต้องการเล่นกับงานที่ทำอยู่คุณจะต้อง:

และทักษะและความอดทนที่พอเหมาะ

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการจัดการ 2038 ในโลก Linux 32 บิตดูLWNและการเผยแพร่ของ 2038 BoF ที่ DebConf 17 (พร้อมความเห็นติดตามและLWN ) บทความ LWN มกราคม 2019 นี้อธิบายการเปลี่ยนแปลงที่กำลังดำเนินการในเคอร์เนล

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