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クラスの使い方を忘れてしまったら、この記事を思い出してくださいね!






