Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

$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年問題を引き起こす可能性がある。 

sounisi5011
最近はNode.jsでTypeScript製のライブラリ開発ばかりして遊んでる無職(大学院生)です。古のPHPや、HTML5、CSS3などの知識もあります。 正規表現もそれなりに扱えますが、JavaScriptとPHPで学んでいるので、アマチュアレベルの実力だと思っています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした