日本のタイムゾーンによる日付からインスタンスを作成
$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。
- PHP :: Bug #67634 :: getTimestamp() modify instance of DateTimeImmutable
- PHP - DateTime::getTimestamp()すると日付が変わる件 - Qiita
- PHP - DateTime クラスのまとめメモ - Qiita #getTimestampのバグ