bash-日付、32ビットLINUXシステムで2038バグを回避


9

「2038年のバグ」に遭遇した小さなbashスクリプトを書きました。以前はこの問題について知らなかったので、この魔法の日付(2038年1月19日03:14:07 UTC)でスクリプトが計算しようとしたとき--debugに得た出力を投稿しました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'

dateこの日付でGNUを計算させる方法はありますか?
(LINUX 32ビットシステム)

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

3
32ビットシステムでこの問題を回避する1つの方法は、* BSD OSを使用することです。
Rui F Ribeiro 2017年

1
bashではありませんが、search.cpan.org
〜mschwern / Time

1
@Kusalananda不明瞭で申し訳ありません。はい、私はGNUの方法について質問していますdate。私は...私の質問を編集します
ナス

FWIW、OpenBSDはそれを2014年に修正しました。大変な作業でしたが、なんとかして関連するすべての部分にパッチを当てることができました。
桂佐藤

@RuiFRibeiro正確には当てはまりません。time_tは、i386を除く、サポートされているすべてのアーキテクチャで8バイトです。
アイザック

回答:


14

date32ビットLinuxでGNUを使用したい場合、2038年以降の日付でそれを動作させる簡単な方法はありませんcoreutilsメンテナーはこれをcoreutilsバグとは見なさないので、修正は期待できません。修正には来てCライブラリとカーネル。進行中の作業をいじりたい場合は、次のものが必要です。

ある程度のスキルと忍耐力。

2038が32ビットLinuxの世界で処理されるように計画された方法の詳細については、LWNおよびDebConf 17での2038 BoFの記事を参照してください(そこでのフォローアップコメントとLWNについて)。この2019年1月のLWN記事では、カーネルに実装されている変更について説明しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.