【PHP】前月・翌月の末日を求めるときは慎重に
前月・翌月を求めるとき起算日や計算方法によっては、正確に求められないことがあります。
確認環境¶
- PHP 7.3
<?php
// 10月31日の前月の末日を取得したい
echo date('Y-m-d', strtotime('2019-10-31 -1 month'));
// 想定:2019-09-30
// 実際:2019-10-01
// 10月31日の翌月の末日を取得したい
echo date('Y-m-d', strtotime('2019-10-31 +1 month'));
// 想定:2019-11-30
// 実際:2019-12-01
// 🤔🤔🤔
多分こんなからくり。
- 2019-10-31の一月前 => 2019-09-31 => 9月に31日はないので繰り上げて2019-10-01。
- 2019-10-31の一月後 => 2019-11-31 => 11月に31日はないので繰り上げて2019-12-01。
正確に求めたい場合は以下の指定をしましょう。
<?php
//=====================
// 前月
//=====================
// 一番スマート
echo date('Y-m-d', strtotime('2019-10-31 last day of previous month'));
// 2019-09-30
// 当月の初日を取得したあとに、1日マイナスする
$firstDayOfThisMonth = date('Y-m-d', strtotime('2019-10-31 first day of this month'));
echo date('Y-m-d', strtotime($firstDayOfThisMonth . '-1 day'));
// 2019-09-30
//=====================
// 翌月
//=====================
// スマート
echo date('Y-m-d', strtotime('2019-10-31 last day of next month'));
// 2019-11-30