【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)) { |
これでよいかな・ω・?
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; を入れればうまく動いたでござる・ω・
Comments