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

特定の日付を元に明日の日付や1週間後の日付、一時間後の時間などの日時の加算や、昨日の日付や昨年の日付などの日時の減算の方法です。
PHPのstrtotime関数やDateTimeクラスを使えば簡単に取得できます。

※先月の日付を取得する際は、月末日の関係でおかしな日付になることもあるので注意！
(last day of previous month)を使ってください。

## strtotime関数

strtotime関数の詳細は[こちら](https://www.php.net/manual/ja/function.strtotime.php)を参考にしてください。
`YYYY-mm-dd`は元となる日付です。

### PHPで日付の加算をする
```php
echo date("Y-m-d", strtotime("YYYY-mm-dd 1 day")); // １日後の日付を取得する場合
echo date("Y-m-d", strtotime("YYYY-mm-dd 1 month")); // １週間後の日付を取得する場合
echo date("Y-m-d", strtotime("YYYY-mm-dd 1 year")); // 一ヶ月後の日付を取得する場合
echo date("Y-m-d", strtotime("YYYY-mm-dd 1 week")); // １年後の日付を取得する場合

//例
echo date("Y-m-d", strtotime("1 day")); // 2023-01-31
//又は
echo date("Y-m-d", strtotime("2022-12-31 1 day")); // 2023-01-01
```

### PHPで日付の減算をする

```php
echo date("Y-m-d", strtotime("YYYY-mm-dd -1 day")); // １日前の日付を取得する場合
echo date("Y-m-d", strtotime("YYYY-mm-dd -1 month")); // １週間前の日付を取得する場合
echo date("Y-m-d", strtotime("YYYY-mm-dd -1 year")); // 一ヶ月前の日付を取得する場合
echo date("Y-m-d", strtotime("YYYY-mm-dd -1 week")); // １年前の日付を取得する場合

//例
echo date("Y-m-d", strtotime("-1 day")); // 2022-12-30
//又は
echo date("Y-m-d", strtotime("2022-12-31 -1 day")); // 2022-12-30
```

## DateTimeクラス

DateTimeクラスの詳細は[こちら](https://www.php.net/manual/ja/class.datetime.php)を参考にしてください。
`YYYY-mm-dd`は元となる日付です。

### PHPで日付の加算をする
```php
$date = new DateTime('now'); // 又は $date = new DateTime('YYYY-mm-dd');
$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('2022-12-31');
$date->modify('+1 day');
echo $date->format('Y-m-d'); // 2023-01-01
```

### PHPで日付の減算をする
```php
$date = new DateTime('now'); // 又は $date = new DateTime('YYYY-mm-dd');
$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('2022-12-31');
$date->modify('-1 day');
echo $date->format('Y-m-d'); // 2022-12-30
```

## 日数算出
2つの日付の日数差を計算(日数のみ)
```php
  $date1 = strtotime("2023-02-03");
  $date2 = strtotime("2023-02-02");

  // 秒数を86400で割ると日数になります
  // 86400 = (60 * 60 * 24)
  $date3 = ($date1 - $date2) / 86400;
  echo $date3 . '日'; // 1日
```
※UNIXタイムスタンプは、1970年1月1日00時00分00秒UTC（協定世界時と一致する標準時）らの経過秒数です。例えば2019年5月15日1時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 月曜日に<br>始まる年単位の週番号|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