PHP

【PHP】2038年問題を回避する

こんにちは、らいか(@hideiwa1)です。

今回は、日時を扱う上で問題となる、「2038年問題」について解説します。

2038年問題とは

2038年問題とは、date() 関数を使用した時に、2038年以降の日時がエラーとなる問題です。

伝統的なシステムでは、Unixタイムスタンプは「符号つき32ビットの整数型」とされています。
符号つき32ビットの整数型では、「-2,147,483,647  ~ 2,147,483,647 」の数字が表現できます。
そして、Unixタイムスタンプで 2,147,483,647 は「2038年1月19日3時14分7秒」となります。

「2038年1月19日3時14分7秒」を過ぎた場合、数値がオーバーフローしてマイナスの値を示すことになります。

011111111111111111111111111111112,147,483,6472038年1月19日3時14分7秒
10000000000000000000000000000000-2,147,483,6481901年12月13日20時45分52秒

つまり、「2038年1月19日3時14分7秒」の1秒後は「1901年12月13日20時45分52秒」と認識されることになります。
これでは、システムに不具合が発生するのは明らかです。

回避する方法

64ビット対応のシステムを使用する

1つ目の解決策は、「64ビット」に対応したシステムを使用することです。

基本的に、最近のOSでは64ビットに対応しています。
それに伴い、PHPも64ビットで使用することが出来る為、「2038年問題」は問題となりません。

しかし、何らかの事情でシステムの入れ替え・更新が出来ないケースもあり得ます。
その場合、32ビットのシステムで対応をせざるを得なくなります。

そのようなケースに対応するには、次のDateTimeクラスを使用する必要があります。

DateTimeクラスを使用する

DateTimeクラスでは、日時を「年、月、日、時、分、秒…」などと個別のデータとして扱っています。
そのため、「秒」のみを基準とするUnixタイムスタンプの問題は発生しません。

date() 関数で行えることは、基本的にDateTimeクラスでも行えるため、特段の理由がない限り「DateTimeクラス」を使用する方が安全といえます。

まとめ

PHPで日時を扱う場合は、「DateTimeクラス」を使用する。