PHPでは、strtotime() 関数や DateTime クラスを利用することで、
「明日」「1週間後」「1時間後」といった日付の加算や、
「昨日」「1年前」などの日付の減算を簡単に行うことができます。
✅ 注意点:月末の処理について
月末の日付から「1ヶ月前」や「1ヶ月後」を取得する場合は、日付のずれに注意が必要です。
たとえば「2023-03-31」に1ヶ月を加算すると、「2023-04-31」という日付は存在しないため、自動的に「2023-05-01」へ補正されることがあります。
正確に月末日を取得したい場合は、last day of previous month のような指定を使用する方法がおすすめです。
strtotime関数を使う
strtotime関数の詳細は公式マニュアルを参照してください。
strtotime() は、文字列で指定した日時を Unix タイムスタンプに変換する関数です。
基準となる日付を指定しない場合は「現在日時」が基準になります。
特定の日付を基準にしたい場合は、次のように第2引数へ YYYY-mm-dd 形式で指定します。
strtotime("+1 day", strtotime("2026-01-30"));
加算例
現在日時を基準にした例です。
echo date("Y-m-d", strtotime("+1 day")); // 明日
echo date("Y-m-d", strtotime("+1 week")); // 1週間後
echo date("Y-m-d", strtotime("+1 month")); // 1ヶ月後
echo date("Y-m-d", strtotime("+1 year")); // 1年後
特定の日付を基準にする場合:
echo date("Y-m-d", strtotime("1 day")); // 2026-01-01
減算例
現在日時を基準にした例です。
echo date("Y-m-d", strtotime("-1 day")); // 昨日
echo date("Y-m-d", strtotime("-1 week")); // 1週間前
echo date("Y-m-d", strtotime("-1 month")); // 1ヶ月前
echo date("Y-m-d", strtotime("-1 year")); // 1年前
特定の日付を基準にする場合:
echo date("Y-m-d", strtotime("-1 day")); // 2025-12-30
DateTimeクラスを使う
DateTimeクラスの詳細は公式マニュアルを参照してください。
DateTime クラスは、日付や時刻の操作をオブジェクト指向で扱える機能です。
YYYY-mm-dd 形式で基準となる日付を指定できます。指定しない場合は、now(現在日時)が基準になります。
加算の例
// 現在日時を基準にする場合
$date = new DateTime('now');
$date->modify('+1 day');
$date->modify('+1 week');
$date->modify('+1 month');
$date->modify('+1 year');
// 複数の加算をまとめて指定することも可能
$date->modify('+1 day +1 week +1 month +1 year');
// 表示フォーマットは自由に変更可能
echo $date->format('Y-m-d');
特定の日付を基準にする場合:
$date = new DateTime('2025-12-31');
$date->modify('+1 day');
echo $date->format('Y-m-d');
// 2026-01-01
減算の例
// 現在日時を基準にする場合
$date = new DateTime('now');
$date->modify('-1 day');
$date->modify('-1 week');
$date->modify('-1 month');
$date->modify('-1 year');
// 複数の減算もまとめて指定可能
$date->modify('-1 day -1 week -1 month -1 year');
echo $date->format('Y-m-d');
特定の日付を基準にする場合:
$date = new DateTime('2025-12-31');
$date->modify('-1 day');
echo $date->format('Y-m-d');
// 2025-12-30
日数算出
2つの日付の差を「日数」で計算する方法です。
$date1 = strtotime("2023-02-03");
$date2 = strtotime("2023-02-02");
// 秒数を 86400(60秒 × 60分 × 24時間)で割ると日数になります
$diff = ($date1 - $date2) / 86400;
echo $diff . '日'; // => 1日
🔎 解説
strtotime() は日時を UNIXタイムスタンプ(秒) に変換します。
UNIXタイムスタンプ同士を引き算すると「秒数の差」が求められます。
1日は 60 × 60 × 24 = 86400秒 なので、86400で割ることで日数を算出できます。
⚠️ 注意点
計算結果は小数になる場合があります。必要に応じて floor() や round() を使用してください。
サマータイム(DST)の影響を受ける環境では、単純に 86400 で割る方法は正確でない場合があります。
より正確に日数差を求めたい場合は、DateTime と diff() を使う方法がおすすめです。
$date1 = new DateTime("2023-02-03");
$date2 = new DateTime("2023-02-02");
$interval = $date1->diff($date2);
echo $interval->days . '日'; // => 1日
📝 UNIXタイムスタンプとは
UNIXタイムスタンプとは、
1970年1月1日 00:00:00 UTC からの経過秒数を表す数値です。
例えば、2019年5月15日 01:34:25 のUNIXタイムスタンプは 1557851665 になります。
フォーマット一覧
| フォーマット | 説明 |
|---|---|
| now | 現在の日時 |
| tomorrow | 明日 |
| yesterday | 昨日 |
| +1 day | 1日後 |
| +1 week | 1週間後 |
| +1 month | 1ヶ月後 |
| +1 year | 1年後 |
| +1 hour | 1時間後 |
| +1 minute | 1分後 |
| +1 second | 1秒後 |
| last day of previous month | 先月の末日 |
| 項目 | フォーマット | 説明 | サンプル |
|---|---|---|---|
| 年 | Y | 西暦(4桁) | 2024 |
| y | 西暦(2桁) | 24 | |
| L | うるう年→1、普通の年→0 | 0, 1 | |
| 月 | m | 月(2桁) | 01〜12 |
| n | 月(先頭の0なし) | 1〜12 | |
| M | 英語(略語) | Jan〜Dec | |
| F | 英語 | January〜December | |
| 日 | d | 日(2桁) | 01〜31 |
| j | 日(先頭の0なし) | 1〜31 | |
| t | その月の日数 | 28〜31 | |
| z | その年の経過日数 | 0〜365 | |
| 曜日・週 | D | 英語(略語) | Mon〜Sun |
| l | 英語 | Sunday〜Saturday | |
| w | 曜日(日曜0→土6) | 2 | |
| W | ISO 8601 月曜日に 始まる年単位の週番号 |
42 (年の第 42 週目) | |
| 時間 | H | 24時間単位 | 00〜23 |
| G | 24時間単位(先頭の0なし) | 0〜23 | |
| h | 12時間単位 | 01〜12 | |
| g | 12時間単位(先頭の0なし) | 1〜12 | |
| a | 午前/午後(小文字) | am | |
| A | 午前/午後(大文字) | AM | |
| 分 | i | 分(2桁) | 00〜59 |
| 秒 | s | 秒(2桁) | 00〜59 |
その他の記事
【令和も対応】PHPで和暦⇔西暦変換
https://qiita.com/thiagomatsui/items/57201fea2b4853654bec
参考サイト
https://blog.codecamp.jp/php-datetime-calc
https://www.flatflag.nir87.com/modify-495