PHPのDateTimeクラスを使って、よくある日付や時刻の扱い方をご紹介します!
現在時刻を取得する
DateTimeクラスでは、下記のようにして現在時刻を取得することができます。
<?php
$now = new DateTime();
echo $now->format('H:i');
// 23:46
解説
$now = new DateTime();
DateTimeクラスのインスタンスを作成し、$now変数に代入しています。
$now->format('H:i');
format()メソッドの第一引数に渡された任意のフォーマットで日時の文字列が返されます。この場合は、01:05のように2桁の数字で現在の時刻が返されます。
よく使われるフォーマット文字
フォーマット文字 | 説明 | 戻り値の例 |
Y | 年。4桁の数字 | 2020 |
m | 月。2桁の数字 | 01から12 |
n | 月。0埋めなしの数字 | 1から12 |
d | 日。2桁の数字 | 01から31 |
j | 日。0埋めなしの数字 | 1から31 |
w | 曜日。数字 | 0(日曜)から6(土曜) |
H | 時。2桁の数字。24時間単位 | 00から23 |
i | 分。2桁の数字 | 00から59 |
s | 秒。2桁の数字 | 00から59 |
これらの文字と任意の文字列(/や月など)を組み合わせて、format()メソッドに渡します。
例えば今日の日付を「〇月×日」のフォーマットで取得したいときは、このように書きます。
$now->format('n月j日');
// 7月4日
PHPでは、サーバのタイムゾーンに基づいて現在日時が取得されます。
「時間がおかしいな?」と思ったときは、date_default_timezone_get()関数の結果が”Asia/Tokyo”になっていることをまず確認することをオススメします:)
コンストラクタで日時を指定する
DateTimeクラスでは、現在日時だけでなく好きな日時を指定することもできます。
$tanabata = new DateTime('2011-07-07');
echo $tanabata->format('Y年m月d日');
// 2011年07月07日
解説
new DateTime('2011-07-07');
コンストラクタに渡した任意の日付のDateTimeオブジェクトを取得しています。
時刻まで指定したいときは、例えばこのように書きます。
new DateTime('2011-07-07 11:30');
コンストラクタの引数に使える書式は他にもあります。
興味のある方はこちらをご覧ください。
modify()メソッドで日時を変更する
modify()メソッドを利用することで、一度作成したDateTimeオブジェクトの日時を後から変更することもできます。
$date = new DateTime('2000-12-31 10:00:00');
$date->modify('+1 day');
echo $date->format('Y-m-d H:i:s');
// 2001-01-01 10:00:00
解説
$date->modify('+1 day');
2000年12月31日 10時00分00秒として作成されていたDateTimeオブジェクトの日付を、1日後に変更しています。
+1の部分を+2に変更すれば2日後、-1に変更すれば1日前になります。
$date->modify('-1 day');
echo $date->format('Y-m-d H:i:s');
// 2000-12-30 10:00:00
また、day部分をmonthに変更すれば1ヶ月後、hourに変更すれば1時間後になります。
$date->modify('+1 month');
echo $date->format('Y-m-d H:i:s');
// 2001-01-31 10:00:00
DateTimeクラスが使えるPHPのバージョン
PHP 5.2.0以降
date()関数はやめましょう
PHPには、DateTimeクラスの他にもdate()関数という日時を扱える関数がありますが、いわゆる「2038年問題」と呼ばれる不具合が発見されています。
これは、32bitの環境上では2038年1月19日3時14分08秒までしか扱うことができないという問題です。
date()関数だけでなく、strtotime()関数も同様の問題を抱えています。
本題から逸れるのでここでは詳しく解説しませんが、興味のある方は「php date 2038年問題」等で検索していただくと解説記事がたくさん見つかると思います:)