3

以下のperlコマンドを使用して、エポック時間を読み取り可能なローカル時間に変換しようとしています:

       bash-3.2$ perl -le print\ scalar\ localtime\ 32503651200
       Thu Mar  9 19:13:52 1911

2038 年未満は正しく変換できますが、2038 年よりも大きい年は期待どおりの結果が得られませんでした。

修正方法を教えてください。ありがとう。

4

2 に答える 2

8

32 ビット システムの2038 年のバグは Perl 5.12.0 で回避されました(64 ビット システムは 2038 バグの影響を受けません)。私はそれを(助けを借りて)やったので知っています。:) Perl をアップグレードするだけで、問題 (および他の多くの問題) が解決されます。

または、 DateTimeなどの日付ライブラリを使用します。システム時刻関数 (2038 バグの根源) に依存せず、y2038 バグの影響を受けず、一般的にはるかに使いやすくなっています。

Perl をアップグレードできず、とを使用する必要がある場合は、 Time::y2038を使用して、2038 バグの影響を受けないバージョンの関数を取得できます。localtimegmtime

于 2016-09-23T04:58:04.497 に答える
0

2038年問題

2038 年問題は、時間値が符号付き 32 ビット整数として保存または計算される計算およびデータ保存状況の問題であり、この数値は 1970 年 1 月 1 日の 00:00:00 UTC からの秒数として解釈されます。 (「エポック」)。1このような実装では、2038 年 1 月 19 日の 03:14:07 UTC 以降の時刻をエンコードできません。この問題は、「Y2K 問題」(「ミレニアム バグ」としても知られています) に似ていますが、完全には類似していません。 1900 年以降の年数は、2000 年以降をエンコードできませんでした。ほとんどの 32 ビット Unix 系システムは、この「Unix 時間」形式で時間を保存および操作します。

于 2016-09-23T04:34:09.693 に答える