Bash - дата, працює навколо помилки 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'

Чи є спосіб змусити ГНУ dateобчислювати цю дату?
(для 32-бітної системи LINUX)

  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
@Kusalananda вибачте за незрозумілість. Так, я запитую про спосіб для GNU date. Я буду правити моє запитання ...
натй

FWIW, OpenBSD виправили це в 2014 році . Це було багато роботи, але якось їм вдалося закріпити всі відповідні біти.
Satō Katsura

Відповіді:


14

Якщо ви хочете дотримуватися GNU dateна 32-розрядному Linux, не існує простого способу змусити його працювати з датами після 2038 року .coreutilscoreutils Обслуговуючі не вважають це помилкою , тому не чекайте виправлення там - виправлення буде надходити з бібліотеки С та ядра. Якщо ви хочете пограти з незавершеною роботою, вам знадобиться:

і гідну кількість майстерності та терпіння.

Докладніше про те, як планувалося обробляти 2038 рік у 32-розрядному світі Linux, див. LWN та підписання BoF 2038 на DebConf 17 (з подальшими коментарями там і на LWN ). Ця стаття LWN січня 2019 року описує зміни, які впроваджуються в ядро.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.