日付・時刻関数の2038年問題

 従来からある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

 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

詳しくは、PHPマニュアルを参照してください。

○PHPマニュアル
[manual func=”date_create”] — DateTimeオブジェクトを作成する
[manual func=”date_add”] — DateTimeオブジェクトに日付や時刻を加算する
[manual func=”date_format”] — 日付や時刻に書式を付ける

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク