32ビットPCでは数値を扱う限界があります。
PHPで日付を扱う事が多いと思いますが、UNIXタイムスタンプを利用すると数値 の限界に引っかかる事を知っておく必要があります。
32ビットPCで扱う数値限界は 2の31乗-1 で、 2147483647 です。 これをUNIXタイムとして日付に直すと、
<?php
$unixtime_max = pow(2, 31) - 1;
echo date('Y-m-d H:i:s', $unixtime_max) . "\n";
$unixtime_overflow = $unixtime_max + 1;
echo date('Y-m-d H:i:s', $unixtime_overflow) . "\n";
?>
2038-01-19 12:14:07
1901-12-14 05:45:52
となり、2038-01-19 12:14:07 以降の日付は扱えません。 これを一般的に「2038年問題」と呼びます。
既に2038年を超えるデータを扱うシステムでは上記の問題に直面しているはずで す。
末永く利用する(できる)システムでは、UNIXタイムスタンプを用いたコーディング は出来ません。
この問題を回避するには、PEARのCalcクラスを利用しましょう。
<?php
require_once "Date/Calc.php";
$nextday = Date_Calc::nextDay('31', '12', '2999', '%Y-%m-%d');
echo $nextday;
?>
3000-01-01
Calcクラスを使うと速度が遅くなってしまいますがUNIXタイムを扱いませんので、 子孫にやさしいコーディングを行う事が出来ます。
- PEAR::Date
- http://pear.php.net/package/Date
- date関数
- http://jp2.php.net/date
この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。