32ビットPCでは数値を扱う限界があります。

PHPで日付を扱う事が多いと思いますが、UNIXタイムスタンプを利用すると数値 の限界に引っかかる事を知っておく必要があります。

32ビットPCで扱う数値限界は 2の31乗-1 で、 2147483647 です。 これをUNIXタイムとして日付に直すと、

<?php
$unixtime_max 
pow(231) - 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開発者をサポートする情報を掲載しています。