DateTimeクラスで日付操作

PHPで日付や時刻を扱う方法をまとめました。timezoneの設定とDateTimeクラスの使い方について書いてます。

timezoneの設定

日本時刻を扱いたい場合、設定ファイル(php.ini)で次のように指定します。

date.timezone = "Asia/Tokyo"

php.iniを修正できない場合は、ソース内で次のように指定します。

date_default_timezone_set('Asia/Tokyo'); 

DateTimeクラス

PHPにはDateTimeクラスという日付を扱うためのクラスが用意されています。

DateTimeオブジェクトの生成

// 現在時刻
$date1 = new DateTime();
var_dump($date1);
//object(DateTime)[1]
//  public 'date' => string '2015-07-18 15:53:15.000000' (length=26)
//  public 'timezone_type' => int 3
//  public 'timezone' => string 'Asia/Tokyo' (length=10)
 
 
// 日時指定
$date2 = new DateTime('2015-04-01 12:22:33');
var_dump($date2);
//object(DateTime)[2]
//  public 'date' => string '2015-04-01 12:22:33.000000' (length=26)
//  public 'timezone_type' => int 3
//  public 'timezone' => string 'Asia/Tokyo' (length=10)
 
 
// 日指定
$date3 = new DateTime('2015-04-01');
var_dump($date3);
//object(DateTime)[3]
//  public 'date' => string '2015-04-01 00:00:00.000000' (length=26)
//  public 'timezone_type' => int 3
//  public 'timezone' => string 'Asia/Tokyo' (length=10)
 
// 比較
if ($date1 > $date2) {
    echo $date1->format('Y/m/d') . "は、" .
         $date2->format('Y/m/d') . "よりも後なので実行されます。";
}
// 2015/07/18は、2015/04/01よりも後なので実行されます。

日付文字列で生成

下記のように、日付文字列を使って指定もできます。

// 現在
$date1 = new DateTime('now');
echo $date1->format('Y/m/d H:i:s');  // 2016/09/26 09:04:38
 
// 明日
$date2 = new DateTime('tomorrow');
echo $date2->format('Y/m/d H:i:s');  // 2016/09/27 00:00:00
 
// 昨日
$date3 = new DateTime('yesterday');
echo $date3->format('Y/m/d H:i:s');  // 2016/09/25 00:00:00
 
// 今月末
$date4 = new DateTime('last day of now');
echo $date4->format('Y/m/d H:i:s');  // 2016/09/30 09:04:38
 
// 次の月曜
$date5 = new DateTime('next Monday');
echo $date5->format('Y/m/d H:i:s');  // 2016/10/03 00:00:00
 
// 前の月曜
$date6 = new DateTime('last Monday');
echo $date6->format('Y/m/d H:i:s');  // 2016/09/19 00:00:00
 
// 複数指定
$date7 = new DateTime('+1 week 1 days 1 hours 1 seconds');
echo $date7->format('Y/m/d H:i:s');  // 2016/10/04 10:04:39

表示形式(フォーマット)の変更

formatメソッドで日付の表示形式を変更できます。

$date1 = new DateTime();   //  現在時刻 ⇒ '2015-07-18 16:19:47.000000' 
 
echo $date1->format('Y/m/d H:i:s') . "</br>";  //   2015/07/18 16:19:47
echo $date1->format('y/n/j G:i:s') . "</br>";  //   15/7/18 16:19:47
echo $date1->format('w') . "</br>";            //   6
フォーマット文字 概要
Y 年(2015)
y 年(15)
m 月(01 ~ 12)
n 月(1 ~ 12)
d 日(01 ~ 31)
j 日(1 ~ 31)
H 時(00 ~ 23)
G 時(0 ~ 23)
i 分(00 ~ 59)
s 秒(00 ~ 59)
w 曜日(0[日] ~ 6[土])

日付の差分や加減算

diffメソッド addメソッド subメソッドを利用します。

$date1 = new DateTime('2015-04-01');
$date2 = new DateTime('2015-05-01');
 
// date1からdate2までの経過日数
$diff = $date1->diff($date2);          // DateIntervalオブジェクトが返される
echo $diff->format('%a日') . "</br>";  // 30日
 
// $date1の日付を1か月と5日後にする
$date1->add(DateInterval::createFromDateString('1 month 5 day'));
echo $date1->format('Y/m/d H:i:s') . "</br>";    // 2015/05/06 00:00:00
 
// $date1の日付を1日前にする
$date1->sub(DateInterval::createFromDateString('1 day'));
echo $date1->format('Y/m/d H:i:s') . "</br>";   // 2015/05/05 00:00:00
 
// $date1の時間を1時間20分30秒後にする
$date1->add(DateInterval::createFromDateString('1 hour 20 minute 30 second'));
echo $date1->format('Y/m/d H:i:s') . "</br>";   // 2015/05/05 01:20:30
 
// 来月末を求める
$now = new DateTime('first day of now');                        // まずは今月の最初の日を求める
echo $now->format('Y/m/d H:i:s') . "</br>";                     // 2015/07/01 17:28:30
$now->add(DateInterval::createFromDateString('1 month'));       // 一か月後にする
echo $now->format('Y/m/d H:i:s') . "</br>";                     // 2015/08/01 17:28:30
$lastday = new Datetime('last day of ' . $now->format('M Y'));  // 月末を求める
echo $lastday->format('Y/m/d H:i:s') . "</br>";                 // 2015/08/31 00:00:00
わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。