うるう年を加味して1年後を表示する方法 PHP編

この記事を書いているのは2015年5月7日ですが、本日より1年間まめわざの有料プランをご利用いただいた場合、このプランが終了する日付はPHPでどのようにして表示できるでしょうか。
とても簡単そうですが、うるう年の罠があるので記事にしてみます。

タイムスタンプに1年を加算する

まず、PHPで日付を表示するにはdate()関数を利用します。2015年5月7日に
date("Y/m/d")
とすれば2015/05/07と表示されます。
第2引数にタイプスタンプを指定して日付を調整できますので、
date("Y/m/d", time()+24*60*60)
として、time()=現在のタイムスタンプの24時間後(24×60×60秒後)を指定すれば2015/05/08となります。

よって、1年後の日付を表示するのに
date("Y/m/d", time()+365*24*60*60)
とすると、うるう年の2月を含まない場合は2016/05/06となりますが、うるう年の2月を含むと2016/05/05と2日前になってしまいます。

年にプラス1、日にマイナス1としてmktimeする

そこでタイムスタンプの作り方を工夫します。
タイムスタンプを作るにはmktime()関数が利用できます。
mktime(時, 分, 秒, 月, 日, 年)
として年月日時分秒からタイムスタンプを指定できるので、
mktime(0, 0, 0, date("n"), date("j")-1, date("Y")+1)
とします。date("n")は本日の月、date("j")は本日の日、date("Y")は本日の年で、
年にプラス1、日にマイナス1として、1年後の前日を指定します。
これにより、うるう年の2月を含む場合が無視できるようになります。
date関数を含めれば、
date("Y/m/d", mktime(0, 0, 0, date("n"), date("j")-1, date("Y")+1)

date("Y年n月j日", mktime(0, 0, 0, date("n"), date("j")-1, date("Y")+1)
となります。

尚、dateの第1引数でmとn、dとjの違いは、ゼロフィルかどうかです。

  • date("Y/m/d")
    2015/05/07
  • date("Y/n/j")
    2015/5/7

来年がうるう年であり、ちょうど現在が上記の間違いに気づきやすい時期です。
逆に来年の3月以降は、上記の間違いをしても気付くまでに4年かかりますので、ちょうどこの機会に記事にしてみました。

2015/5/7