こんにちは、らいか(@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秒」を過ぎた場合、数値がオーバーフローしてマイナスの値を示すことになります。
01111111111111111111111111111111 | 2,147,483,647 | 2038年1月19日3時14分7秒 |
10000000000000000000000000000000 | -2,147,483,648 | 1901年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クラス」を使用する。