この記事のポイント
DateTimeImmutableクラスは、日付操作において元のオブジェクトを変更しない安全な仕組みで使えます。以下のポイントを押さえることで、確実に習得できます。
- 不変オブジェクトによる予期しないバグの防止
- 豊富なメソッドを使った柔軟な日付フォーマット処理
- 実際の開発現場で使える実用的なコード例の理解
これらの知識を身に付けることで、より安全で保守性の高いコードを書けるようになります。
DateTimeImmutableクラスとは?
DateTimeImmutableクラスは、PHP5.5以降で使用できる日付・時刻を扱うためのクラスです。
このクラスの最大の特徴は、一度作成されたオブジェクトの値を変更できない「不変(immutable)」な性質を持つことです。従来のDateTimeクラスとは異なり、日付の計算や変更を行うたびに新しいオブジェクトが作成されるため、元のオブジェクトが意図せず変更されてしまうバグを防げます。
これにより、複数の処理で同じ日付オブジェクトを安全に使い回すことができ、より安全で予測しやすいコードを書くことが可能になります。
【関連】
PHPをもっと詳しく学ぶならpaizaラーニング
基本構文
DateTimeImmutableクラスの基本的な使い方を、具体的なコード例とともに見ていきましょう。オブジェクトの作成はnewキーワードを使用し、引数には日付文字列やフォーマットを指定できます。作成されたオブジェクトに対してメソッドを呼び出すことで、フォーマット変換や日付操作を行えます。重要なのは、どのメソッドを呼び出しても元のオブジェクトは変更されず、新しいオブジェクトが返される点です。
<?php
// 現在の日時でオブジェクトを作成
$date = new DateTimeImmutable();
echo $date->format('Y-m-d H:i:s');
?>
出力結果(例)
2025-08-14 10:30:45
※このページ内のコードの出力結果の一部で、実行した時刻により変動するものがあります。また、時刻はUTC形式で計算されるため、日本時間での計算結果と異なる場合があります
<?php
// 特定の日付でオブジェクトを作成
$specificDate = new DateTimeImmutable('2025-12-25');
echo $specificDate->format('Y年n月j日');
?>
出力結果
2025年12月25日
実用例
ここからは、DateTimeImmutableクラスの実用的な使用例を具体的なコード例とともに紹介します。実際の開発現場でよく使われるパターンを厳選し、それぞれのコード例には詳細な説明を付けています。
各例では、日付の作成、操作、フォーマット、比較など、様々な場面で活用できる技術を学べます。コード例は実行可能な形で記載しているため、実際に試しながら理解を深めることができます。
現在日時の取得と表示
現在の日時を取得して、幅広い形式で表示する基本的な例です。業務システムでログ出力やタイムスタンプ記録によく使用されます。
<?php
$now = new DateTimeImmutable();
echo "現在時刻: " . $now->format('Y-m-d H:i:s') . "\n";
echo "表示用: " . $now->format('Y年n月j日 G時i分') . "\n";
?>
出力結果(例)
現在時刻: 2025-08-15 14:23:17
表示用: 2025年8月15日 14時23分
特定の日付の作成
文字列から特定の日付オブジェクトを作成する例です。ユーザー入力やデータベースから取得した日付文字列を扱う際に重要な技術です。
<?php
$birthday = new DateTimeImmutable('1990-05-20');
$formatted = $birthday->format('Y年n月j日(l)');
echo "パンダの誕生日: " . $formatted . "\n";
echo "UNIX時間: " . $birthday->getTimestamp();
?>
出力結果
パンダの誕生日: 1990年5月20日(Sunday)
UNIX時間: 643161600
日付の加算・減算
既存の日付に対して期間を加算・減算する例です。契約期間の計算や定期処理の実行日計算などでよく使われます。
<?php
$startDate = new DateTimeImmutable('2025-01-01');
$afterMonth = $startDate->add(new DateInterval('P1M'));
$beforeWeek = $startDate->sub(new DateInterval('P1W'));
echo "開始日: " . $startDate->format('Y-m-d') . "\n";
echo "1ヵ月後: " . $afterMonth->format('Y-m-d') . "\n";
echo "1週間前: " . $beforeWeek->format('Y-m-d');
?>
出力結果
開始日: 2025-01-01
1ヵ月後: 2025-02-01
1週間前: 2025-12-25
日付の比較
複数の日付オブジェクトを比較する例です。期限チェックや日付の並び替えなど、条件分岐で頻繁に使用される技術です。
<?php
$date1 = new DateTimeImmutable('2025-03-15');
$date2 = new DateTimeImmutable('2025-03-20');
if ($date1 < $date2) {
echo "キリンが先に到着しました\n";
}
echo "差分: " . $date1->diff($date2)->days . "日";
?>
出力結果
キリンが先に到着しました
差分: 5日
タイムゾーンの変更
異なるタイムゾーン間での時刻変換を行う例です。国際的なWebアプリケーションや多地域対応システムで必須の機能です。
<?php
$tokyoTime = new DateTimeImmutable('2025-01-15 15:00:00', new DateTimeZone('Asia/Tokyo'));
$nyTime = $tokyoTime->setTimezone(new DateTimeZone('America/New_York'));
echo "東京時間: " . $tokyoTime->format('Y-m-d H:i:s T') . "\n";
echo "NY時間: " . $nyTime->format('Y-m-d H:i:s T') ;
?>
出力結果
東京時間: 2025-01-15 15:00:00 JST
NY時間: 2025-01-15 01:00:00 EST
月末日の取得
指定された月の最終日を取得する例です。請求書作成や月次処理などのビジネスロジックでよく必要になります。
<?php
$date = new DateTimeImmutable('2025-02-15');
$lastDay = $date->modify('last day of this month');
echo "2月の日数: " . $lastDay->format('j') . "日\n";
echo "最終日: " . $lastDay->format('Y-m-d') ;
?>
出力結果
2月の日数: 28日
最終日: 2025-02-28
キリンの記念日: 2025年12月25日
曜日の判定
指定した日付の曜日を判定する例です。営業日計算や定期実行処理のスケジューリングで活用されます。
<?php
$date = new DateTimeImmutable('2025-01-15');
$dayOfWeek = $date->format('N');
if ($dayOfWeek >= 6) {
echo "週末です - トラがお休み\n";
} else {
echo "平日です - ヒツジが働いています\n";
}
echo "曜日番号: " . $dayOfWeek;
?>
出力結果
平日です - ヒツジが働いています
曜日番号: 3
日付間の差分計算
2つの日付間の詳細な差分を計算する例です。年齢計算や契約期間の計算など、精密な期間計算が必要な場面で使用されます。
<?php
$start = new DateTimeImmutable('2020-01-01');
$end = new DateTimeImmutable('2025-01-15');
$diff = $start->diff($end);
echo "経過期間: " . $diff->y . "年" . $diff->m . "ヵ月" . $diff->d . "日\n";
echo "総日数: " . $diff->days . "日 - イヌが見守っています";
?>
出力結果
経過期間: 5年0ヵ月14日
総日数: 1841日 - イヌが見守っています
まとめ
DateTimeImmutableクラスは、安全で信頼性の高い日付操作を実現するための重要なツールです。不変オブジェクトの特性により、予期しないバグを防ぎながら、柔軟な日付処理を実装できます。
DateTimeImmutableクラスの活躍する場面
- Webアプリケーションでのユーザー登録日時管理
- ECサイトでの注文・配送日程の計算処理
- 業務システムでのスケジュール・期限管理機能
重要なポイント
- オブジェクトが不変なので安全性が高い
- 豊富なメソッドで多様な日付操作が可能
- タイムゾーン対応で国際的な開発にも適用
これらの特徴を活かすことで、保守性が高く、バグの少ないコードを書くことができます。日付操作が必要な場面では、従来のDateTimeクラスではなく、DateTimeImmutableクラスの使用を検討することをお勧めします。実際のプロジェクトでも、この記事で紹介したコード例を参考に、要件に応じてカスタマイズしながら活用してください。
レベルを更に上げたい方はpaizaプログラミングスキルチェックへ