2

重複の可能性:
2038 年に備えるために何をすべきか?

2038年問題とは?

コードにその問題があるかどうかを調べて解決するにはどうすればよいでしょうか?

4

3 に答える 3

2

C では、標準の 4 バイト形式は、時刻の開始が 1970 年 1 月 1 日午前 12:00:00 であると想定しています。この値は 0 です。負の (無効な) 値にロールオーバーするまでの時間の最大値は2,147,483,647、つまり 2038 年 1 月 19 日です。この日から、標準時ライブラリを使用するすべての C プログラムで、日付の計算に問題が発生し始めます。これを修正するには、8-ストレージ形式のバイト値。

于 2011-06-20T09:07:34.553 に答える
2

これを試してみてください: 2 行目 (および 3 行目) が 2038 年でない場合、システムには 2038 年の問題があります。

#include <stdio.h>
#include <time.h>

int main(void) {
  time_t x;

  x = (time_t)((1U << 31) - 1);
  printf("%s\n", ctime(&x));
  x += 1;
  printf("%s\n", ctime(&x));
  x += 1;
  printf("%s\n", ctime(&x));

  return 0;
}

ideoneでコードが「実行中」: 問題のあるシステムcodepad
でコードが「実行中」: 問題のあるシステム

于 2011-06-20T09:27:59.947 に答える
0

00:00:00 UTF 以降のシステム時間を符号なし整数の形式で保存または使用するプログラムは、2038 年 1 月 19 日に範囲外になります。ほとんどのソフトウェアは 2038 年にこの問題に直面しますが、将来の日付を保存するソフトウェアはそれよりも早く影響を受けます。 .

回避策として、より大きなストレージ形式で時間を格納する (関連する) コードを再コンパイルする必要があります。どうやら、すべてのコンパイラ プロバイダが既にソリューションの準備が整っているようです。

また、64 ビット オペレーティング システムでは、すべての時刻整数に対して 64 ビット ラッパーが既に使用されています。これにより、危険は私たちの時間枠をはるかに超えてしまいます。次の世代がより良い解決策を見つけられるようにしましょう。

于 2011-06-20T09:14:52.177 に答える