- ベストアンサー
PHPのmktime関数についての日付計算の不具合についてのアドバイスをお願いします
- PHPのmktime関数を使用した日付計算において、不具合が発生しています。
- 具体的には、2005/1/29の1ヶ月後が20050301となってしまうなど、期待した結果が得られない状況です。
- 解決策として、mktime関数をラップした関数を作成することで、例外処理や必要な処理を追加できるようにすることが考えられます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1補足>ようは、月末の日の数を超えた場合は、月末の日の数にするということみたいなので、以下の様にすればいいかと思います。 ※mktimeは、本来引数を省略できるので、本当は、引数を省略した場合の処理をしないといけないですが、サンプルでは、そのような処理はしていません。 function mktime_ex($hour,$minute,$second,$month,$day,$year){ $monthDay = array(31,28,31,30,31,30,31,31,30,31,30,31); if(($year % 400 == 0) || (($year % 4 == 0) && ($year % 100 != 0))){ $monthDay[1]=29; //閏年 } if($day>$monthDay[$month-1]){//指定された月の日の数より大きい時 $day=$monthDay[$month-1];//その月末の日の数にする } return mktime( $hour,$minute,$second,$month,$day,$year); }
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>2005/1/29の1ヶ月後:20050301 >2005/1/30の1ヶ月後:20050302 >2005/1/31の1ヶ月後:20050303 ウチで実行したところ上記のようになりました。 実行結果としては正しい(不具合ではない) 2005/1/29:一ヶ月後 2005/1+1/29→2005/02/29 2005年の2月28日までなので、翌日になり (> 2004/1/30の1ヶ月後:20040301、の場合は、2004年が閏年のため2/29までだから2/30→3/1) 2005/02/29→2005/03/01 かと思いますが、 どのようになれるのが理想の結果なのでしょうか?
補足
>2005/1+1/29→2005/02/29 >2005年の2月28日までなので、翌日になり >(> 2004/1/30の1ヶ月後:20040301、の場合は、2004年が閏年のため2/29までだから2/30→3/1) >2005/02/29→2005/03/01 計算としてはそれが正しいのですが、 2005/1/29の一ヶ月後を2005/2/28としたいのです。 実行結果が↓ 2004/1/30の1ヶ月後:20040229 2005/1/29の1ヶ月後:20050228 2005/1/30の1ヶ月後:20050228 2005/1/31の1ヶ月後:20050228 のようになってほしいのですが… 引き続きアドバイスを宜しくお願いします。
お礼
なるほど、大変解りやすいプログラムです。 その方法を使わせていただきますね。 また、逆に2004/3/31の一ヶ月前を2004/2/29としたいときも その方法と同じようにやればいいのですよね。 ちょっと試してみます。 ありがとうございました。