PHP：DateTime クラスと DateTimeImmutable クラスの違いを整理してみた

## はじめに

この記事では、PHPの `DateTime` クラスと `DateTimeImmutable` クラスの違いについて、初学者の視点から整理したまとめ記事です。

内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです。

## 書こうと思ったきっかけ

個人的にPHPのキャッチアップをしたくて、勉強している初学者による備忘録として記録しています。

:::note
**日付や時刻の操作はWeb開発において頻繁に登場するため、基礎をしっかり理解したいと考え、まとめています。**
:::

また、現時点では自分の中で使い分けがあいまいなため、自分の言葉でしっかり説明できるようになることをゴールとしています。

## 内容

PHPの `DateTime` クラスと `DateTimeImmutable` クラスの違いは「**変更できるかどうか？**」です。以下のように覚えるとシンプルでした。

### 結論：

| クラス名              | 特徴              |
| ----------------- | --------------- |
| DateTime          | 変更可能（mutable）   |
| DateTimeImmutable | 変更不可（immutable） |

### `DateTime` クラスを使ってみた

```php
<?php
// DateTime（元のオブジェクトが変更される）
$date = new DateTime('2025-05-31');
$date->modify('+1 day');
echo $date->format('Y-m-d');  // → 2025-06-01
```

- `new DateTime('2025-05-31')`  
  → 「2025-05-31」の日付を持つ DateTime オブジェクトを作成。

- `$date->modify('+1 day')`  
  → その日付に 1 日を加えて、「2025-06-01」に変更。

- `$date->format('Y-m-d')`  
  → 日付を「2025-06-01」という文字列に整形。

- `echo` で出力  
  → 結果として「2025-06-01」が表示される。

**実際のターミナル画面**

![Screenshot 2025-05-31 at 8.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e05b732e-5d32-4fab-bb9a-39489b4668ee.png)

### `DateTimeImmutable` クラスを使ってみた

```php
<?php
// DateTimeImmutable（元のオブジェクトはそのまま）
$date = new DateTimeImmutable('2025-05-31');
$newDate = $date->modify('+1 day');

echo $date->format('Y-m-d') . PHP_EOL;      // → 2025-05-31
echo $newDate->format('Y-m-d') . PHP_EOL;   // → 2025-06-01
```

- `new DateTimeImmutable('2025-05-31')`  
  → 「2025-05-31」の日付を持つ **変更不可の** オブジェクトを作成。

- `$date->modify('+1 day')`  
  → **元の `$date` は変更せず**、新しい日付（2025-06-01）を持つオブジェクト `$newDate` を返す。

- `$date->format('Y-m-d')`  
  → 元の日付をそのまま表示 → `2025-05-31`

- `$newDate->format('Y-m-d')`  
  → 1日後の新しい日付を表示 → `2025-06-01`

**実際のターミナル画面**

![Screenshot 2025-05-31 at 8.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3b693586-601c-45f3-8093-ac624352474f.png)

### どっちを使うべき？

* 今の日時を操作しながら変えたいなら → `DateTime`
* 元の日時を残しておきたい、安全に扱いたいなら → `DateTimeImmutable`

:::note warn
**最近のコードでは、安全性の面から `DateTimeImmutable` がよく使われているみたいです...！**
:::

**参考文献**

https://qiita.com/juve_534/items/b450dc4072bb5539582a

https://gallu.hatenadiary.jp/entry/20170309/p1

### 公式マニュアルより引用：

#### DateTimeImmutable クラス

> 日付と時刻を表現します。
> このクラスは DateTime と同じ振る舞いをします。 但し、DateTime::modify() のような、状態を変更して新しいオブジェクトを返すメソッドが呼び出された時を除きます。

**引用文献**

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

#### DateTime クラス

> 日付と時刻を表現するクラスです。
> このクラスは、 DateTimeImmutable と同じ振る舞いをします。 但し、DateTime::modify() のような、オブジェクトそのものを変更するメソッドが呼び出された時を除きます。

> **警告**: DateTime クラスのメソッドをコールすると、そのインスタンスにカプセル化された情報が変更されます。そうした変更を防ぎたい場合には、新しいオブジェクトを作るために clone 演算子を使わなければいけません。オブジェクトの変更を防ぐ、望ましい挙動をデフォルトで実現するには、DateTime ではなく、DateTimeImmutable を使います。

**引用文献**

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

## まとめ

ここまで読んでいただき、ありがとうございました！

* `DateTime` はオブジェクトを直接変更するため、使い方によっては予期せぬ副作用が起こる可能性がある。
* `DateTimeImmutable` は変更があるたびに**新しいオブジェクトを返す**ため、安全に扱える。
* 開発の安全性や予測可能性を重視するなら、`DateTimeImmutable` の使用がおすすめ。

まだまだ細かい関数の使い分けには苦戦していますが、さまざまな観点から「**どちらがより安全か？**」を自分の言葉で説明できるよう、引き続きしっかり取り組んでいきます。

今後ともよろしくお願いいたします...！