PHPでは日付や時刻を扱うにはDateTimeクラスを使用します。
この記事では、
- DateTimeクラスとは
- DateTimeクラスの基本的な使い方
- フォーマットを指定する方法(formatメソッド)
などの基本的な解説から、
- 日付を比較する方法
- 日付を計算する方法(add)
- タイムゾーンの取得と設定
などの応用的な方法についても解説していきます。よく忘れるPHPの時間(datetime)処理を行うメソッドやその使い方についてまとめていますので、ぜひご覧になってください。
DateTImeクラスとは
日付や時間を扱った計算や操作を行うには、DateTimeクラスを使用します。DateTimeクラスはPHP5.2.0以降であれば使用可能です。DateTimeクラスは以下のように記述します。
$now = new DateTime(“日付”);
引数は指定しない場合は現在の日時を取得することができます。
フォーマットの指定方法(format)
DateTimeクラスで日時のフォーマットを指定するにはformatメソッドを使用します。
public string DateTime::format ( string $format )
formatメソッドは第一引数にフォーマット文字列を指定します。サポートされているフォーマット文字列については、以下のページに記載されています。
http://php.net/manual/ja/function.date.php
以下ではformatメソッドを使用する方法について紹介します。
<?php // 文字列から $date = new DateTime('2012-03-24 17:45:12'); echo $date->format('Y-m-d H:i:s'); #output: 2012-03-24 17:45:12// 数値から $date = new DateTime(); echo $date->format('Y-m-d H:i:s'); // 2014-08-06 21:15:49 $date = new DateTime(); $date->setDate(2014,8,1); echo $date->format('Y-m-d H:i:s'); // 2014-08-01 21:04:25 $date = new DateTime(); $date->setDate(2014,8,1)->setTime(1,10,13); echo $date->format('Y-m-d H:i:s'); // 2014-08-01 01:10:13 $format = 'Y年m月d日 H時i分s秒'; $date = DateTime::createFromFormat($format, '2014年02月05日 23時11分24秒'); echo $date->format('Y-m-d H:i:s'); $date = new DateTime(); $timezone = $date->getTimezone(); echo $timezone->getName(); //現在のtimezone:Asia/Tokyo echo $date->format('Y-m-d H:i:s'); // 2014-08-06 21:09:59 // timezone変更 $date->setTimezone(new DateTimeZone('Europe/London')); echo $date->format('Y-m-d H:i:s'); // 2014-08-06 13:09:59 // 最初っからtimezoneを指定 $date = new DateTime(null,new DateTimeZone('Europe/London')); echo $date->format('Y-m-d H:i:s'); // 2014-08-06 13:09:59 $date = new DateTime(); echo $date->format('Y-m-d h:i:s a'); // 2014-08-06 9:23:46 pm echo $date->format('y-F-d D'); // 14-August-06 Wed echo $date->format('t'); // 31 // 定義済み書式 echo $date->format(DateTime::ATOM); // 2014-08-06T21:28:50+09:00 echo $date->format(DateTime::COOKIE);// Wednesday, 06-Aug-14 21:28:50 JST echo $date->format(DateTime::RSS); // Wed, 06 Aug 2014 21:28:50 +0900 echo $date->format(DateTime::W3C); // 2014-08-06T21:28:50+09:00 ?>
formatメソッドの詳しい使い方については、以下の記事でも詳しく解説しています!
日付を比較する方法
DateTimeクラスで取得した日付同士で比較を行うことも可能です。
<?php //文字列での比較 $date1 = new DateTime("now"); $date2 = new DateTime("tomorrow"); var_dump($date1 == $date2); var_dump($date1 < $date2); var_dump($date1 > $date2); ?>
上の例の出力は以下となります。
bool(false) bool(true) bool(false)
タイムスタンプでの比較
<?php $today = date("Y/m/d"); $target_day = "2014/06/10"; if(strtotime($today) === strtotime($target_day)){ echo "ターゲット日付は今日です"; }else if(strtotime($today) > strtotime($target_day)){ echo "ターゲット日付は過去です"; }else{ echo "ターゲット日付は未来です"; } ?>
文字列での比較
日付は以下のように文字列での比較もできます。
<?php $today = date('Y/m/d'); $target = '2014/06/10'; printf( 'ターゲット日付は%sです', $today === $target ? '本日' : ($today > $target ? '過去' : '未来') ); ?>
日付を計算する方法(add)
ここでは日付を使用しての計算方法を紹介します。
基本形
<?php $date = new DateTime('2017-08-05'); //1日後 echo $date->modify('+1 days')->format('Y-m-d H:i:s'); $date = new DateTime('2017-08-05'); //1日前 echo $date->modify('-1 days')->format('Y-m-d H:i:s'); ?>
加算
<?php $date = new DateTime('2017-08-05'); $date->modify('+6 hours'); // 6時間後 $date->modify('+1 weeks'); // 1週間後 $date->modify('+1 months + 2 days + 3 hours'); // 1ヶ月2日3時間後 $date->modify('noon'); // 正午に $date->modify('first day of this months'); // 当月1日 $date->modify('last day of this months'); // 当月末尾 $date->modify('first day of next months'); // 来月1日 $date->modify('first day of last months'); // 先月1日 $date->modify('sunday'); // 次の日曜日 $date->modify('third sunday of this months') // 第三日曜日 ?>
diff(日時の差分を取得する)
<?php $datetime1 = new DateTime('2017-10-11'); $datetime2 = new DateTime('2017-10-13'); $interval = $datetime1->diff($datetime2); echo $interval->format('%R%a days'); ?>
出力結果:
+2 days
タイムスタンプ取得
<?php date_default_timezone_set('Asia/Tokyo'); $date = new DateTime(); echo $date->getTimestamp(); //getTimestampのバグ $date = new DateTime('2017/01/01 00:00:00'); $date->modify('first day of -1 second'); var_dump($date->format('Y-m-d H:i:s')); //var_dump($date->getTimestamp()); ← こちらは日付が変わる var_dump($date->format('U')); // ← こちらは日付が変わらない var_dump($date->format('Y-m-d H:i:s')); ?>
DateTime と DateTimeImmutable
DateTimeImmutableクラスは、基本的にDateTimeクラスと同じメソッドを持ちます。DateTimeクラスの異なる点はDateTimeImmutableは、自身は変更せずに新しいオブジェクトを返します。PHP5.5以上が使えるのなら、DateTimeImmutableの方がおすすめです。
<?php date_default_timezone_set('Asia/Tokyo'); $date = new DateTIme(); $date->modify('+1 days'); echo $date->format('Y-m-d H:i:s'); $date = new DateTimeImmutable(); $tommorow = $date->modify('+1 days'); echo $tommorow->format('Y-m-d H:i:s'); ?>
関連記事
PHPの日付(date)のメソッドの使い方や、Array(配列)文法・メソッドの使い方については、以下の記事で詳しく解説しています! 網羅的に解説していますので、ぜひ参考にしてくださいね!
まとめ
ここではDateTime関数を使用して、
- DateTimeクラスとは
- formatメソッドを使用して日付をフォーマットする方法
- 日付を比較する方法
- 日付を計算する方法(add)
などについて解説しました。DateTimeクラスは日付を扱う上でよく使用しますので、この機会によく覚えておきましょう! もし、DateTimeクラスの使い方を忘れてしまったら、この記事を思い出してくださいね!