PHPで一月前の日付を取得する

投稿日:

PHP でひと月前の日付を取得するという場合、一番簡単な方法は strtotime() を使う方法だと思います。

date("Y-m-d",strtotime("-1 month"));

この場合、現時点(2011年8月2日)で実行すると「2011-07-02」が戻ってきますが、月末、たとえば 31日などに実行した場合には期待通りの日付を得ることが出来ません。

たとえば、以下のスクリプトは 7月 31日に実行した場合の状況を作り出してるのですが、結果は「2011-07-01」となります。

date("Y-m-d",strtotime("-1 month", strtotime("2011-7-31")));

「6月は31日がないから7月1日」って感じなんでしょうね。

個人的には
「6月は31日がないから6月30日」
の方が感覚的に近いのですが、この辺りは人によって違うと思うので何とも言えません。

ただ、こういう感じで動作するので PHP で「ひと月前」的な感じで日付を取得する場合には注意する必要があります。

たとえば、一月前の月の1日を求めようとした場合、単純に以下のように書いたらだめなわけです。

date("Y-m-01", strtotime("-1 month"));

この結果は、1日から 28日の間に実行されていれば意図通りに動きますが、29~31日に実行した場合には意図しない結果になってしまう事があります。

たとえば、先ほどの例で行けば上記のスクリプトを 8月2日に実行した場合には「2011-07-01」が戻ってくるので期待どおりです。
が、7月31日に実行した場合、この場合の期待値は「2011-06-01」ですが、「2011-07-01」が返ってきてしまいます。

という事で、この場合には mktime() を使うのが良さそうです。

date("Y-m-d", mktime("0","0","0",date("m")-1,"1",date("Y")));

これだと、7月31日に実行した場合でも「2011-06-01」が返ってくるようです。


まぁ、よくわからないですね。

MySQL で、以下のように SUBDATE を使って7月31日の一月前の日付を求めた場合には 6月30日が返ってきます。

SELECT SUBDATE('2011-07-31', INTERVAL 1 MONTH)

個人的にはこっちの方が考え方的に好きですが、言語によって考え方が違うので注意が必要ですね。

更新日: