従来からあるdate関数などの日付・時刻関数は、32ビットコンピュータでは2038年頃に限界がきます。「PHP入門」という点では今すぐ大問題になるわけではありませんが、実社会ではもう少し早く問題が発生する場合があります。
<?php for ($i = 2147483640; $i < 2147483650; $i++) { echo date("Y/m/d H:i:s", $i) . "<br />"; } ?>
○実行結果
2038/01/19 12:14:00
2038/01/19 12:14:01
2038/01/19 12:14:02
2038/01/19 12:14:03
2038/01/19 12:14:04
2038/01/19 12:14:05
2038/01/19 12:14:06
2038/01/19 12:14:07
1901/12/14 05:45:52
1901/12/14 05:45:53
2038/01/19 12:14:01
2038/01/19 12:14:02
2038/01/19 12:14:03
2038/01/19 12:14:04
2038/01/19 12:14:05
2038/01/19 12:14:06
2038/01/19 12:14:07
1901/12/14 05:45:52
1901/12/14 05:45:53
PHP5から使用可能なdate_create関数やdate_format関数を使用すると、この問題に対処することができます。
<?php $d = date_create("2050/12/31"); // 日付の作成 echo date_format($d, "Y/m/d") . "<br />"; $d->add(new DateInterval('P5D')); // 日付の加算 echo date_format($d, "Y/m/d") . "<br />"; $d = date_create("NOW"); echo date_format($d, "Y/m/d") . "<br />"; $d = date_create("+ 1 DAY"); echo date_format($d, "Y/m/d") . "<br />"; ?>
2行目で作成したDateTimeオブジェクトは2050年の日付で、2038年を過ぎても使えることがわかります。5行目で日付を加算しています。「P5D」は日付間隔を示すDateInterval オブジェクトを作成するときに指定する間隔指示子で、ここでは5日(period・5days)を指しています。2038年を過ぎていますが、日付の加算も問題なく行われることがわかります。
○実行結果
2050/12/31
2051/01/05
2012/08/31
2012/09/01
2051/01/05
2012/08/31
2012/09/01
詳しくは、PHPマニュアルを参照してください。
○PHPマニュアル
[manual func=”date_create”] — DateTimeオブジェクトを作成する
[manual func=”date_add”] — DateTimeオブジェクトに日付や時刻を加算する
[manual func=”date_format”] — 日付や時刻に書式を付ける