ポジションが定まらないヤツ

ポジションが定まらない奴のブログ

PHP で先月の月初月末日付を取得する( -1 month に関するどうでもいい話)

業務改善にあたり「先月の数字をほにゃらら」見たいな要件が出たので調べました。

例によってググって見ると、date('Y-m-t', strtotime(date('Y-m-01') . '-1 month'));みたいのが多かったのですが、PHP のドキュメントを読みに行ってみたら「0とか-1とか無くてこっちの方が好みだな」という書き方に辿り着いたので書いておきます。

DateTime で欲しいときは以下

<?php
// 先月初日
new \DateTime('first day of midnight previous month');

// 先月末日
new \DateTime('last day of midnight previous month');

文字列で欲しいときは以下

<?php
// 先月初日
echo date('Y-m-d', strtotime('first day of previous month'));

// 先月末日
echo date('Y-m-d', strtotime('last day of previous month'));

参考:PHP: Relative Formats - Manual

どうでもいい話

PHP のドキュメントでも多少言及されていますが、〜 month 表記を「(進んだ or 戻った)月の同じ日付」という感覚で利用すると基準となる日付次第で問題が発生するケースがあります。「基準日から見て〜ヶ月(前 or 後)の初日や末日が欲しい」という要件に関しては、「基準月の1日を求めてから云々」等の解決方法を結構見かけましたが、そんなにゴニョゴニョしなくても明示的に first day oflast day of を記載する事で該当の問題が発生することを避けることが可能です。

月ごとに日数は異なるので、月末月初に関わらず「来月」という「日」の概念が若干ふんわりしている要件には注意してあたろうと改めて思いました。

<?php
echo date('Y-m-d', strtotime('2016-01-31 next month'));
// 2016-03-02 <- マジかよw

echo date('Y-m-t', strtotime('2016-01-31 next month'));
// 2016-03-31 <- 2月なんてなかった

echo date('Y-m-d', strtotime('2016-01-31 last day of next month'));
// 2016-02-29 <- 欲しかった結果

追伸:ぼくは先月分のデータ引っ張るなら 先月初日 ≦ x < 当月初日 が好きです。