ITエンジニアの技術メモ

神奈川在住のITエンジニアの備忘録です。主にプログラミング(Perl, Java など)やネットワーク技術について、仕事などを通じて学んだことを自分の中で整理するためにゆるゆると書いています。誰かのご参考になれば幸いです。

2038年問題への対応

C言語で作成されたアプリの2038年問題への対応について調べてみた。なお、2038年問題については以下を参照。

2038年問題 - Wikipedia

 

2038年問題で主に問題として挙げられるのは、時刻データを格納する time_t 型が符号付き 32bit なので、その最大値は (2^31 − 1) = 2,147,483,647 となり、扱える年数が 2,147,483,647秒 (≒ 68年) までに限られてしまうことである。

 上述の time_t 型は、time.h にて long 型として定義(typedef)されており、long 型は limits.h でその最大値が定義されている。long 型の最大値は処理系 (コンパイラ) によって変わり、32bit 環境のものでは (2^31 − 1) = 2,147,483,647 となり、64bit 環境のものでは (2^63 - 1) = 9,223,372,036,854,775,807 となることが多いようだ。time_t 型が (2^63 - 1) まであれば、西暦3000億年くらいまで使用できるので、もうxxxx年問題とか気にしなくて良いレベルである。

 

つまり、long 型が 64bit で定義されている環境 (処理系) でアプリをコンパイルすれば、time_t 型で扱える年数が格段に増えて、2038年問題を回避できるはず。最近の環境ではそうなっていることが多いと思うので、新しめの環境でアプリをコンパイルすれば、だいたい2038年問題対策は出来ていることになるのだろう。

# 時刻を表すのに time_t 型を使わず、int 型などを使っていたら、その部分の修正も必要になってくるが・・。

 

以下も参考にさせて頂きました。 

C言語と2038年問題 - エクセレンス★ブログ