PHPのDateTimeクラスで日時を扱う

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クラスでは、現在日時だけでなく好きな日時を指定することもできます。

日付を2011年7月7日にする
$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');
MEMO

コンストラクタの引数に使える書式は他にもあります。

興味のある方はこちらをご覧ください。

https://www.php.net/manual/ja/datetime.formats.php

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年問題」等で検索していただくと解説記事がたくさん見つかると思います:)

MEMO

DateTimeクラスについてもっと詳しく知りたい方は、公式マニュアルをご覧ください?

https://www.php.net/manual/ja/class.datetime.php