24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPで日、月、年の加算と減算方法

24
Last updated at Posted at 2020-10-16

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 で割る方法は正確でない場合があります。
より正確に日数差を求めたい場合は、DateTimediff() を使う方法がおすすめです。

$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

24
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?