【PHP】指定日時の○ヶ月前と○ヶ月後の月を正確に取得する
PHPで指定日時の○ヶ月前と○ヶ月後の月を正確に取得する方法をまとめています。
○ヶ月前と○ヶ月後の月を取得
指定日時の○ヶ月前や○ヶ月後の月は次のようにして取得することができます。
※指定日時は「2014-05-28」
<?php //指定日時 $target_day = "2014-05-28"; //1ヶ月前の日時を取得 echo date("m",strtotime($target_day . "-1 month")); //1ヶ月後の日時を取得 echo date("Y-m-d",strtotime($target_day . "+1 month")); ?>
出力結果:04 06
日時によっては正確に取得できない
しかし、【PHP】指定時間前や指定時間後の日時を求めるの「注意」にあるように、日時によっては正確な月を取得できない場合があります。
※指定日時は「2014-03-31」
<?php //指定日時 $target_day = "2014-03-31"; //1ヶ月前の日時を取得 echo date("m",strtotime($target_day . "-1 month")); echo "<br />"; //1ヶ月後の日時を取得 echo date("m",strtotime($target_day . "+1 month")); ?>
出力結果:03 05
この場合、本来「02」月と「04」月の値が欲しいにも関わらず、「03」月と「05」月となっています。
この理由は上記リンクページに記載していますが、strtotime関数の挙動に起因しています。
【原因】
strtotime関数で○ヶ月前や○ヶ月後を求めると、単純に月の引き算と足し算が行われる。
2014-03-31の1ヶ月前は「2014-02-31」となる
2014-03-31の1ヶ月後は「2014-04-31」となる
2月は28日まで、4月は30日までしかないので、超過した日数は翌月に繰り越される。
「2014-02-31」→「2014-03-03」
「2014-04-31」→「2014-05-01」
正確に月を求める方法
月によっては28日までだったり、30日までだったり、31日までだったり、閏年の場合は29日までだったりと月によって日数が違うのが正しい月を取得できない原因です。
そのため指定日時の○ヶ月前や○ヶ月後を求める場合、その日時をいったん月はじめに戻してあげれば良いです。
<?php //指定日時 $target_day = "2014-03-31"; //指定日時を月はじめに変換する $target_day = date("Y-m-1", strtotime($target_day)); //1ヶ月前の日時を取得 echo date("m",strtotime($target_day . "-1 month")); //1ヶ月後の日時を取得 echo date("m",strtotime($target_day . "+1 month")); ?>
出力結果:02 04
以上の方法で、○ヶ月前や○ヶ月後の「月」を正確に求めることができると思います。
あわせて読んでほしい!
コメント
まだコメントはありません。