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。
- PHP :: Bug #67634 :: getTimestamp() modify instance of DateTimeImmutable
- PHP - DateTime::getTimestamp()すると日付が変わる件 - Qiita
- PHP - DateTime クラスのまとめメモ - Qiita #getTimestampのバグ
Author And Source
この問題について(DateTimeクラスで日付文字列とUNIX時間(タイムスタンプ)を相互変換するときのまとめ), 我々は、より多くの情報をここで見つけました https://qiita.com/sounisi5011/items/d6df76798d2e23c83e14著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .