suin.io

datetimeのnullの扱いがPHPのバージョンで微妙に違う?

suin2008年10月8日

MySQLで日付情報を持つ方法のひとつとして、データ型をdatetimeにする方法があります。これにすると、"2008-10-08 12:00:00"のような形で保存されるので、単にタイムスタンプをそのまま保存するより見やすいわけで、自分は好んで使っています。注意しなければならないのがdatetime型はnull値が"0000-00-00 00:00:00"となる点です。

意外とこの仕様がPHPで扱う上でくせ者です。datetime型はPHPでは文字列型として扱われるので、汎用性を持たせるにはstrtotime()などを使って、いったんタイムスタンプに変換する必要があります。

<?php
$timeStamp = strtotime($datetime);
?>

ところが、このstrtotime()の挙動がPHPのバージョンによって微妙に異なるようです。

<?php
var_dump(strtotime('0000-00-00 00:00:00'));
var_dump(date('Y-m-d H:i:s', strtotime('0000-00-00 00:00:00')));
?>

上のコードを異なるバージョンのPHPで試してみました。

5.1.6の実行結果:
int(943887600) 
string(19) "1999-11-30 00:00:00"

5.2.6の実行結果:
bool(false)
string(19) "1970-01-01 09:00:00"

結果はご覧のとおりです。この手の仕様はちょっと困りものです。とりあえずの対策は、文字列が'0000-00-00 00:00:00'のとき分岐するような処理を追加するくらいでしょうか。

RELATED POSTS