プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。下のような実行ソースプログラムを作ったのですが、

<?php
  echo("2005/1/29の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,29,2005) )."<BR>" );
  echo("2005/1/30の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,30,2005) )."<BR>" );
  echo("2005/1/31の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,31,2005) )."<BR>" );
?>

実行結果において
> 2004/1/30の1ヶ月後:20040301
> 2005/1/29の1ヶ月後:20050301
> 2005/1/30の1ヶ月後:20050302
のような不具合が出てしまいます。どう直してよいものか行き詰ってしまっているので、どなたかアドバイスを宜しくお願いします。

基本形はfunction_exという関数を作って↓
function mktime_ex(...) {

  例外処理
  必要に応じて return

 // その他は、標準機能に任せる
 return mktime( sec, min, hour, ... );
}
という形にしたいと思っています。
宜しくお願いします。

A 回答 (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);
}
    • good
    • 0
この回答へのお礼

なるほど、大変解りやすいプログラムです。
その方法を使わせていただきますね。
また、逆に2004/3/31の一ヶ月前を2004/2/29としたいときも
その方法と同じようにやればいいのですよね。
ちょっと試してみます。
ありがとうございました。

お礼日時:2005/04/19 09:05

>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
のようになってほしいのですが…
引き続きアドバイスを宜しくお願いします。

補足日時:2005/04/19 04:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!