Bash - дата, исправляющая ошибку 2038 в 32-битной системе LINUX

9

Я написал небольшой сценарий bash, который заставил меня наткнуться на «Ошибка 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рассчитывать на эту дату?
(в 32-битной системе LINUX)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
натх
источник
3
Одним из способов обойти это в 32-битных системах является использование * BSD OS.
Руи Ф Рибейро
1
@Kusalananda извините за неясность. Да, я спрашиваю о способе для GNU date. Я отредактирую свой вопрос ...
nath
FWIW, OpenBSD исправил это в 2014 году . Это было много работы, но каким-то образом им удалось исправить все соответствующие биты.
Satō

Ответы:

14

Если вы хотите придерживаться GNU dateна 32-битной Linux, нет простого способа получить его на работу с датами после 2038 В coreutilsСопровождающих не считает это coreutilsошибкой , так что не ждите исправлений там - исправление будет иметь прийти из библиотеки C и ядра. Если вы хотите поиграть с текущей работой, вам понадобится:

и приличное количество навыков и терпения.

Более подробно о том, как 2038 планировалось обработать в 32-битном мире Linux, см. LWN и описание 2038 BoF на DebConf 17 (с последующими комментариями там и на LWN ). В этой статье LWN за январь 2019 года описаны изменения, которые вносятся в ядро.

Стивен Китт
источник