Bash - tarih, 32bit LINUX sisteminde 2038 hatası etrafında çalışıyor


9

"Year 2038 Bug" a rastlamamı sağlayan küçük bir bash senaryosu yazdım . Daha önce bu sorun hakkında bilmiyordum ve sadece senaryom bu sihirli tarih boyunca (03:14:07 UTC 19 Ocak 2038) hesaplamak için çalışırken aldığım --debugçıktı gönderme cesaret date.

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'

dateBu tarihte GNU hesaplaması yapmanın bir yolu var mı ?
(LINUX 32 bit sistemde)

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

3
32 bit sistemlerde dolaşmanın bir yolu * BSD işletim sistemi kullanmaktır.
Rui F Ribeiro


1
@Kusalananda belirsiz olduğu için üzgünüm. Evet, GNU için bir yol istiyorum date.
Sorumu

FWIW, OpenBSD bunu 2014 yılında düzeltti . Çok fazla işti, ama bir şekilde ilgili tüm parçaları düzeltmeyi başardılar.
Satō Katsura

@RuiFRibeiro Tam olarak doğru değil: time_t , i386 hariç desteklenen tüm mimarilerde 8 bayttır .
Isaac

Yanıtlar:


14

Eğer GNU sopa istiyorsanız date32 bit Linux üzerinde, 2038 sonrasında tarihleri ile işe almak için kolay bir yolu yoktur bu düşünmüyoruz sürdürücüler hata , yani orada bir düzeltme beklemeyin - düzeltme olacak C kütüphanesinden ve çekirdekten gelmek . Devam eden çalışma ile oynamak istiyorsanız, ihtiyacınız olacak:coreutilscoreutils

ve yeterli miktarda beceri ve sabır.

Bu arada 2038 tarihinde daha 32 bit Linux dünyasında ele alınması planlandı için bkz LWN ve yazma-up debconf'u 17'de 2038 BOF ait (sonraki yorumlar var olan ve LWN üzerinde ). Bu Ocak 2019 LWN makalesi , çekirdeğe uygulanan değişiklikleri açıklar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.