【PHP】とあるシステムが、2038年問題非対応だった話

仕事ネタですが、とあるWebシステム。
ユーザーの有効期限が設定できるのですが、
ユーザーの利用期限を 2099年12月31日にすると利用期限内であっても、利用期限が過ぎていますと出て来る問題が発生

該当箇所のソースを見て見た
if (strtotime($start_date) > strtotime($_SESSION['DBDATE'])) {
 $dbg->errorLog("利用可能期間前");
} else if (strtotime ($end_date) < strtotime($_SESSION['DBDATE'])) {
  $dbg->errorLog("利用可能期間後");
} else {
  $dbg->errorLog("利用可能期間内");
}

こんな感じ
確認してみると、 strtotime ("2099-12-31") だと strtotimeが値を返さないため、0と判定されてしまうようだ

実は、サーバーが 64bit環境であれば問題ないのだが、32bit環境で動かすと strtotime は 2038年までしか対応できないのだ

phpで現在日時を取得する方法! | CodeCampus

ここは、DateTime Class を使うのが鉄板のようだ。

date_default_timezone_set('Asia/Tokyo');
$dateStart = new DateTime($start_date);
$dateEnd = new DateTime($end_date);
$dateDb = new DateTime($_SESSION['DBDATE']);

if ($dateStart > $dateDb)) {
 $dbg->errorLog("利用可能期間前");
} else if ($dateEnd < $dateDb) {
  $dbg->errorLog("利用可能期間後");
} else {
  $dbg->errorLog("利用可能期間内");
}

これでよいかな・ω・?

Warning: include(DateTime.php): failed to open stream: No such file or directory
Warning: include(): Failed opening 'DateTime.php' for inclusion (include_path='.;C:\xampp3\php\PEAR')
Fatal error: Class 'DateTime' not found

ところが、 DateTime Class を直接読んでくれない

PHP DateTime class Namespace - Stack Overflow

use \DateTime; を入れればうまく動いたでござる・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です