DateTime クラス
| 対応: | PHP 5.3(2009) |
|---|
オブジェクト指向で日時を操作するクラスです。日時の作成・フォーマット・加算・減算・比較・差分計算など、日時に関するあらゆる操作をメソッドチェーンで扱えます。
構文
// 現在または指定した日時でオブジェクトを作成する $dt = new DateTime($datetime, $timezone); // 日時をフォーマットして文字列で返す $dt->format($format); // 相対的な日時表現で日時を変更する $dt->modify($modifier); // DateInterval を加算する $dt->add($interval); // DateInterval を減算する $dt->sub($interval); // 2つの日時の差分を DateInterval で返す $dt->diff($targetDateTime);
メソッド一覧
| メソッド | 概要 |
|---|---|
| new DateTime($datetime) | 日時オブジェクトを作成します。引数を省略すると現在日時、文字列を渡すと『strtotime()』と同様にパースされます。 |
| format($format) | 『date()』と同じフォーマット文字列で日時を整形します。 |
| modify($modifier) | 『"+1 day"』『"next Monday"』などの相対表現で日時を変更します。オブジェクト自体が更新されます。 |
| add(DateInterval $interval) | DateInterval オブジェクトを使って日時を加算します。 |
| sub(DateInterval $interval) | DateInterval オブジェクトを使って日時を減算します。 |
| diff(DateTime $target) | 2つの DateTime の差分を DateInterval オブジェクトで返します。 |
戻り値
『format()』はフォーマットされた日時文字列を返します。『modify()』『add()』『sub()』は自分自身のオブジェクトを返すため、メソッドチェーンが可能です。『diff()』はDateIntervalオブジェクトを返します。
サンプルコード
sample_datetime.php
<?php
// 現在の日時でオブジェクトを作成する
$now = new DateTime();
echo $now->format("Y-m-d H:i:s"); // 現在の日時が出力される
// 文字列から日時オブジェクトを作成する
$dt = new DateTime("2025-04-15 10:30:00");
echo $dt->format("Y年m月d日 H時i分"); // 『2025年04月15日 10時30分』と出力される
// modify() で日時を変更する
$dt->modify("+1 month");
echo $dt->format("Y-m-d"); // 1か月後の『2025-05-15』と出力される
// メソッドチェーンで連続操作する
$result = (new DateTime("2025-01-01"))->modify("+6 months")->format("Y-m-d");
echo $result; // 『2025-07-01』と出力される
// add() と sub() で DateInterval を使った加減算をする
$dt2 = new DateTime("2025-04-15");
$dt2->add(new DateInterval("P10D")); // 10日を加算する
echo $dt2->format("Y-m-d"); // 『2025-04-25』と出力される
$dt2->sub(new DateInterval("P2M")); // 2か月を減算する
echo $dt2->format("Y-m-d"); // 『2025-02-25』と出力される
// diff() で2つの日時の差分を求める
$start = new DateTime("2025-01-01");
$end = new DateTime("2025-04-15");
$interval = $start->diff($end);
echo $interval->days . "日"; // 『104日』と出力される
echo $interval->format("%m か月と %d 日"); // 『3 か月と 14 日』と出力される
// 年齢を計算する実用例
$birthday = new DateTime("1990-08-20");
$today = new DateTime();
$age = $birthday->diff($today);
echo $age->y . "歳"; // 現在の年齢が出力される
// タイムゾーンを指定して作成する
$tokyo = new DateTime("now", new DateTimeZone("Asia/Tokyo"));
$utc = new DateTime("now", new DateTimeZone("UTC"));
echo $tokyo->format("H:i") . " / " . $utc->format("H:i"); // 日本時間とUTCの時差が確認できる
// DateTimeImmutable を使うとオブジェクトが変更されない
$original = new DateTimeImmutable("2025-04-15");
$modified = $original->modify("+1 day"); // 新しいオブジェクトが返される
echo $original->format("Y-m-d") . "\n"; // 元のオブジェクトは『2025-04-15』のまま
echo $modified->format("Y-m-d") . "\n"; // 変更後は『2025-04-16』
実行すると次のように出力されます。
php sample_datetime.php 2025-04-15 10:30:00 2025年04月15日 10時30分 2025-05-15 2025-07-01 2025-04-25 2025-02-25 104日 3 か月と 14 日 35歳 09:30 / 00:30 2025-04-15 2025-04-16
DateTimeはミュータブル(変更される)
『DateTime::modify()』『add()』『sub()』等を呼ぶと元のオブジェクト自体が変更されます。元の値を保持したい場合は『DateTimeImmutable』を使うか、『clone』演算子でコピーを作成してください。
<?php
// DateTime はメソッドを呼ぶと元のオブジェクトが変わります
$dt = new DateTime("2025-04-01"); // 岡部倫太郎がタイムリープした日(架空)
$dt->modify("+10 days");
echo $dt->format("Y-m-d"); // 『2025-04-11』に変わっています
// 元の "2025-04-01" は失われています
次のように記述します。
<?php
// DateTimeImmutable を使うと元のオブジェクトは変わりません
$original = new DateTimeImmutable("2025-04-01");
$modified = $original->modify("+10 days"); // 新しいオブジェクトが返されます
echo $original->format("Y-m-d"); // 『2025-04-01』のまま
echo $modified->format("Y-m-d"); // 『2025-04-11』
DateIntervalのformat()は日時クラスのformat()と記法が異なる
『DateInterval::format()』は『%d』や『%m』のようにパーセント記号を使います。『date()』や『DateTime::format()』の記法とは別物です。
<?php
$start = new DateTime("2025-01-01");
$end = new DateTime("2025-04-15");
$diff = $start->diff($end);
// DateTime::format() とは記法が違います
echo $diff->format("%m か月と %d 日");
// %Y は4桁年ではなく「年数の差分」を表します
echo $diff->format("%Y 年 %m か月 %d 日"); // 『0 年 3 か月 14 日』
diff()は絶対値を返す
『$a->diff($b)』と『$b->diff($a)』はどちらも正の日数を返します。どちらが未来かどうかは返された『DateInterval』の『invert』プロパティで確認できます(1なら逆順)。
<?php
// 牧瀬紅莉栖が亡くなった日(架空)と岡部倫太郎が過去に戻った日(架空)
$past = new DateTime("2025-01-01");
$future = new DateTime("2025-04-15");
$diff1 = $past->diff($future);
$diff2 = $future->diff($past);
echo $diff1->days; // 『104』
echo $diff2->days; // 『104』(同じ値)
echo $diff1->invert; // 『0』($past から $future なので正順)
echo $diff2->invert; // 『1』($future から $past なので逆順)
実践パターン
セッション有効期限チェック
ログイン時刻と現在時刻を比較してセッションが有効かどうかを判定する例です。
<?php
// 岡部倫太郎がログインした時刻(架空)
$login_at = new DateTime("2025-04-15 10:00:00");
$now = new DateTime("2025-04-15 10:45:00");
$session_ttl = 30; // セッション有効時間(分)
$elapsed_minutes = (int) $login_at->diff($now)->format("%i") + (int) $login_at->diff($now)->h * 60;
if ($elapsed_minutes > $session_ttl) {
echo "セッションが切れています。再ログインが必要です。\n";
} else {
$remaining = $session_ttl - $elapsed_minutes;
echo "セッションは残り {$remaining} 分有効です。\n";
}
sample_session.php
php sample_session.php セッションが切れています。再ログインが必要です。
特定日時までの残り日数計算
Steins;Gateの世界線変動係数の日付(架空)を使って、イベントまでの残り日数を計算する例です。
<?php
// 世界線の収束日(架空のイベント日)
$event = new DateTimeImmutable("2025-08-03");
$today = new DateTimeImmutable("2025-04-15");
$diff = $today->diff($event);
if ($diff->invert) {
echo "イベントは {$diff->days} 日前に終了しています。\n";
} else {
echo "イベントまで残り {$diff->days} 日です。\n";
}
sample_countdown.php
php sample_countdown.php イベントまで残り 110 日です。
概要
DateTime クラスはPHP5.3で導入された、日時操作のためのオブジェクト指向APIです。『date()』や『strtotime()』と同等の機能に加えて、タイムゾーン管理や差分計算など高度な操作も扱えます。
DateTime オブジェクトはミュータブルのため、『modify()』『add()』『sub()』を呼ぶとオブジェクト自体が変更されます。意図しない変更を防ぎたい場合は『DateTimeImmutable』を使用してください。DateTimeImmutable はメソッド呼び出しごとに新しいオブジェクトを返すため、元のオブジェクトは変化しません。
DateInterval の書式は ISO 8601 の期間表記に基づいており、『"P1Y2M3D"』は1年2か月3日、『"PT1H30M"』は1時間30分を表します。P の後に時間を指定する場合は T を挟む必要があります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。