コンテンツにスキップ

【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