DateTimeクラスで日付文字列とUNIX時間(タイムスタンプ)を相互変換するときのまとめ


日本のタイムゾーンによる日付からインスタンスを作成

$date_tokyo_str = '2000-01-01 00:00:00';
$date = new DateTime($date_tokyo_str, new DateTimeZone('Asia/Tokyo'));

第二引数にDateTimeZoneクラスのインスタンスを指定することで、日本のタイムゾーンのインスタンスを取得する。
なお、DateTimeクラスコンストラクタが対応する形式の日付文字列ではない場合は以下のようにする。

$date_tokyo_str = '2000年01月01日 00時00分00秒';
$date = DateTime::createFromFormat('Y年m月d日 H時i分s秒', $date_tokyo_str, new DateTimeZone('Asia/Tokyo'));

UNIX時間(タイムスタンプ)からインスタンスを作成

$date_unixtime_str = '946652400';
$date = new DateTime('@' . $date_unixtime_str);

日付文字列の場合とは違い、第二引数でタイムゾーンを設定しても無効となる。

なお、タイムスタンプを設定する方法としてDateTime::setTimestampメソッドを利用する方法もあるが、このメソッドはPHPの整数型でタイムスタンプを指定するため2038年問題を引き起こす恐れがある1

インスタンスから日本のタイムゾーンによる日付を取得

$date->setTimezone(new DateTimeZone('Asia/Tokyo'));
$date_tokyo_str = $date->format('Y-m-d H:i:s');

DateTime::setTimezoneメソッドはfalseを返す場合があるため、メソッドチェインにはしていない。
タイムゾーンの設定を上書きするため、後続の処理では注意すること。

インスタンスからUNIX時間(タイムスタンプ)を取得

$date_unixtime_str = $date->format('U');

DateTime::getTimestampメソッドにはバグがあるため、代わりにDateTime::formatメソッドを利用する。

DateTime::getTimestampメソッドとは違い、DateTime::formatメソッドは文字列型でタイムスタンプを返すため、PHPの整数型の上限値を超えたタイムスタンプも正常に扱え、2038年問題を回避できる利点がある1



  1. PHPの動作環境によっては、PHPの整数型の最大値が32ビットのものになる。この場合、整数型で扱えるタイムスタンプの最大値は2147483647となり、2038年1月19日12時14分7秒以降のタイムスタンプを扱えない2038年問題を引き起こす可能性がある。