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