【修正】PHPで特定の日付の翌月or先月の年月日を考慮した月末月初を取得する
※この記事は有識者の方にコメントを頂いたことにより大幅に修正を行っております。
PHPで年月日を考慮した翌月日付を取得したかったので調べてみました。
参考
https://qiita.com/sawadashota/items/7fc8c6ded17720ddbd9d
【Butケース】PHPのdateとstrtotimeを使って翌月と先月を取得
おお!できた?
// 翌月月初
echo date('Y-m-01', strtotime(date('2018-10-01').'+1 month')); // 2018-11-01
// 先月月初
echo date('Y-m-01', strtotime(date('2018-10-01').'-1 month')); // 2018-09-01
と思いきや…
コメントでご指摘頂いた通り
1日以外を指定すると想定と違う動きが…
1日以外が指定される場合だと想定とは全く違う日付になりました。。。
だめじゃん!
// 翌月月初
echo date('Y-m-01', strtotime(date('2018-10-31').'+1 month')); // 2018-12-01
// 先月月初
echo date('Y-m-01', strtotime(date('2018-10-31').'-1 month')); // 2018-10-01
【ok】DateTimeImmutableを使って翌月と先月の月初月末を取得
コメントで頂いたコードをそのまま動かしてみると…
おお!ちゃんとできるらしい!!
DateTimeImmutableとは?
(PHP 5 >= 5.5.0, PHP 7)
このクラスの挙動は DateTime とほぼ同じですが、 自分自身は変更せずに新しいオブジェクトを返すという点だけが異なります。
PHPリファレンス
$dt = DateTimeImmutable::createFromFormat('Y-m-d', '2018-10-31');
// 月初
echo $dt->modify('first day of 00:00:00')->modify('next month')->format('Y-m-d'); // 2018-11-01
echo $dt->modify('first day of 00:00:00')->modify('last month')->format('Y-m-d'); // 2018-09-01
// 月末
echo $dt->modify('first day of 00:00:00')->modify('next month')->modify('last day of')->format('Y-m-d'); // 2018-11-30
echo $dt->modify('first day of 00:00:00')->modify('last month')->modify('last day of')->format('Y-m-d'); // 2018-09-30
.
...
......
がしかし!!
Fatal error: Class 'DateTimeImmutable' not found が出たらPHPのバージョンが5.5より低いから
出社30分でそうそうにテストをした所
とある環境ではPHPのバージョンが5.5より低いらしく今回は利用できませんでした!
php5.5より低い時はどうすれば…
わかりません!
もしご存知で有ればコメント頂けると助かります!
いつも無知な私にご教示いただき誠にありがとうございます!!
案1:月初にしてから月を変える
2018-10-31 -> 2018-10-01
の処理を作ってから
2018-10-01に対してdateとstrtotimeなどで翌月にしてあげる!!