Bash - date, bekerja di sekitar bug 2038 pada sistem LINUX 32bit

9

Saya menulis skrip bash kecil yang membuat saya menemukan "Tahun 2038 Bug" . Saya tidak tahu tentang masalah ini sebelumnya dan saya hanya berani memposting --debugoutput yang saya dapatkan dateketika skrip saya mencoba menghitung di tanggal ajaib ini (03:14:07 UTC pada 19 Januari 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'

Apakah ada cara untuk membuat GNU datemenghitung di tanggal ini?
(pada sistem LINUX 32 bit)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
nath
sumber
3
Salah satu cara untuk menyiasatinya dalam sistem 32 bit adalah menggunakan OS * BSD.
Rui F Ribeiro
1
@ Kusalananda maaf karena tidak jelas. Ya saya bertanya tentang cara untuk GNU date. Aku akan mengedit pertanyaan saya ...
nath
FWIW, OpenBSD memperbaikinya pada tahun 2014 . Itu banyak pekerjaan, tetapi entah bagaimana mereka berhasil menambal semua bit yang relevan.
Satō Katsura
@RuiFRibeiro Tidak sepenuhnya benar: time_t adalah 8 byte pada semua arsitektur yang didukung kecuali i386 .
Isaac

Jawaban:

14

Jika Anda ingin tetap menggunakan GNU datedi Linux 32-bit, tidak ada cara mudah untuk membuatnya bekerja dengan tanggal setelah 2038. Para coreutilspengelola tidak menganggap ini sebagai coreutilsbug , jadi jangan berharap ada perbaikan di sana - perbaikannya akan memiliki datang dari perpustakaan C dan kernel. Jika Anda ingin bermain-main dengan pekerjaan yang sedang berjalan, Anda perlu:

dan keterampilan dan kesabaran yang layak.

Untuk lebih lanjut tentang cara 2038 direncanakan untuk ditangani di dunia Linux 32-bit, lihat LWN dan penulisan BoF 2038 di DebConf 17 (dengan komentar tindak lanjut di sana dan di LWN ). Artikel LWN Januari 2019 ini menjelaskan perubahan yang sedang dilaksanakan di kernel.

Stephen Kitt
sumber