忘れたら読みたいPHPの時間(datetime)で使えるメソッド・使い方まとめ

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

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

山本