• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:経過期間計算がうまくいかない)

経過期間計算で上手くいかない!

このQ&Aのポイント
  • 2つの日付間の経過期間を計算するプログラムでうまくいかない問題が発生しています。例えば、2000/1/1から2000/12/31の経過期間を計算すると、1年と1日ではなく1年になってしまいます。同じプログラムで2000/1/1から2003/12/31の経過期間を計算すると、4年になってしまうなど、上手くいく場合といかない場合が混在しています。
  • プログラムの一部を以下に示します。
  • プログラムは対象日と今日の日付をタイムスタンプに変換し、2つの日付間の差を計算しています。計算結果を年、月、日の形式に変換して表示します。ただし、計算結果が特定の条件の場合には修正を加えています。

質問者が選んだベストアンサー

  • ベストアンサー
noname#111181
noname#111181
回答No.4

カレンダー関数の cal_to_jd を使い、下記のようにしてみました。 うるう年の有無にかかわらず経過期間計算ができるはずです。ご確認ください。 ---------------------------- <?php $date = "2000/1/1"; $date2 = "2000/12/31"; //対象日と今日の日付をそれぞれ配列に格納 $Sday = split("/", $date); $Lday = split("/", $date2); //ユリウス通日を求める $jd0 = cal_to_jd(CAL_GREGORIAN, $Sday[1] , $Sday[2] , $Sday[0]); $jd1 = cal_to_jd(CAL_GREGORIAN, $Lday[1] , $Lday[2] , $Lday[0]); $dd = $jd1 - $jd0 + 1; $yy = 365.25; //1年の平均日数 $mm = 365.25 / 12; //1月の平均日数 //経過年・月・日 $diffY = (int)($dd / $yy); $diffM = (int)(($dd - ($year2 * $yy)) / $mm); $diffD = (int)($dd - ($year2 * $yy) - ($month2 * $mm)); ?>

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3
全文を見る
すると、全ての回答が全文表示されます。
noname#111181
noname#111181
回答No.2

ANo.1で確認を求めた者です。 連投で申し訳ありませんが、もう1つ確認させてください。 たとえば2007年3月1日~2008年2月28日は365日ですが、~2008年2月29日は366日になります。どちらを1年としますか?

marariya
質問者

お礼

<?php echo 'ccc '; if (function_exists(cal_to_jd)) echo 'abc '; else echo 'def'; ?> 日本語の部分を書き換えたのですが、 ccc abc と表示されました 両方1年丁度としたいのですが無理でしょうか? 閏年だけ366日で1年、それ以外は365日で1年で換算するようにしたいのです。

全文を見る
すると、全ての回答が全文表示されます。
noname#111181
noname#111181
回答No.1

原因はうるう年の計算をしていないことです。 まず、ご利用のPHP処理系がカレンダー関数をサポートしているかどうか、下記のスクリプトで確認をしてください。カレンダー関数が有無によって、書くべきスクリプトの量が大幅に変わりますので。 --------------------------- <?php echo 'カレンダー関数'; if (function_exists(cal_to_jd)) echo 'あり'; else echo 'なし'; ?>

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 明日以降の平日表示

    ちょっと頭がこんがらがってわからなくなってしまいました。 明日以降の平日の日付を取得・表示するスクリプトを考えております。 ========= <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+1,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+2,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+3,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+4,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> この方法だとなぜか、 ============ 2007年08月27日 (月) 2007年08月28日 (火) 2007年08月27日 (月) 2007年08月28日 (火) ============ となります。 どこがおかしいのでしょうか?

    • ベストアンサー
    • PHP
  • 日付取得、計算及び表示コードが動作しません。

    日付取得、計算及び表示コードが動作しません。 下記のコードのどこが間違っているのか、どなたかお分かりですか? このコードでは、今日の日付をサーバから取得し、それから10日後の日付を計算して表示したいです。 $currentdate = .getdate(); $yyyy = $currentdate["year"]; $mm = $currentdate["mon"]; $dd = $currentdate["mday"]; $int_day = 10; $duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); echo "$duedate" また、上記のコードが動作するようになったとして、表示される日付は「2008/06/10」のようになるかと思いますが、これを「2008年06月10日」のように表示させる方法をご存知でしょうか? >$duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); 上記コードを下記のように変更してもだめです。 >$duedate = .date("y年m月d日", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); よろしくお願いします。

    • ベストアンサー
    • PHP
  • 1ヶ月後の日付を出力したい

    1ヶ月後の日付を出力したいのですが $tomorrow = mktime (0,0,0,date("m")+1,date("d"),date("Y")); phpマニュアルで上記のようなものを使って、 1970年1月1日からの通算秒を得ることが出来ましたが それとlocationtimeを使ってどうにか1ヶ月後の年月日を出せるようなのですが… やり方がどうしても分かりません。 いろいろ試したんですが、どつぼにハマって行くだけで…。 すみません、誰か助け舟を出して下さい お願いします

    • ベストアンサー
    • PHP
  • 翌日の日付表示で土日を抜きたい

    質問させていただきます。 次回の会合部屋の予約可能日付を表示させるスクリプトを考えています。まず1日後の日付表示を考えているのですが、1日後が土曜日或いは日曜日の際には翌週の月曜日が表示されるようにしたいです。 現状は下記のとおり1日後の日付を表示する事しかできません。 <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+1,date("y")); print date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; ?> 土曜日と日曜日は表示から省かれるようにする方法を教えてください。

    • ベストアンサー
    • PHP
  • phpでの日付の取得について

    PHPでサイト内に、1週間分の日付を表示させ 日付ごとに指定したページに移動するよう、リンクを張りたいと思っております。 以下で日付は表示できたのですが 日付と日付の間にスペースを入れたいです。 ※可能であれば曜日も表示させたいです。 ↓現在、このように表示されます。 1/181/191/201/211/221/231/24 また、日付ごどに指定サイトへリンクも貼りたと思ってます。 <?php $nday = mktime(); for($i=0;$i<7;$i++){ print date("n/j",mktime(0,0,0,date("m",$nday),date("d",$nday)+$i,date("y",$nday)))."<td>"; } ?> どなたか、ご教授いただけないでしょうか? 以上、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 設定日から指定日数後の日付の取得

    全く初心者の質問ですみません。 設定日から指定日数後の日付を取得したいと思っています。 echo $date // 正しい設定日がY-m-dで表示されます date ("Y-m-d", mktime (0,0,0,date('m',$date),date('d',$date) + $add_date,date('Y',$date))); で取得できると思ったのですが、常に1970-01-01が返されます。 先ほどecho $dateで設定した日付が表示されるにもかかわらず、 print_r(getdate($add_date)); とすると [seconds] => 31 [minutes] => 33 [hours] => 9 [mday] => 1 [wday] => 4 [mon] => 1 [year] => 1970 [yday] => 0 [weekday] => Thursday [month] => January [0] => 2011 と1970-01-01が返されます。 何故でしょうか?

    • ベストアンサー
    • PHP
  • 万年カレンダーについて

    万年カレンダーについて質問します。例えば、11月10日(月)が休みとした場合に11月10日(月)セルの背景を赤色にする方法を教えて下さい。下記のプログラムに加える記述方法を教えて下さい。 <?php if($_GET['num']==''){ $today_year =date("Y"); $today_month=date("n"); }else{ $timestamp=mktime(0,0,0,date("n")+$_GET['num'],date("d"),date("Y")); $today_year =date("Y",$timestamp); $today_month=date("n",$timestamp); } $current=mktime(0,0,0,$today_month,1,$today_year); $first_day=date("w",$current); $last_day=date("t",$current); ?> <html> <head> <title>万年カレンダ</title> </head> <body> <h1 style="background:#cccccc"> <?php print(date("Y年m月",$current)); ?>のカレンダ</h1> <table border="1" width="300"> <tr> <th>日</th><th>月</th><th>火</th><th>水</th> <th>木</th><th>金</th><th>土</th> </tr> <?php for($i=1;$i<=$first_day+$last_day;$i++){ if($i%7==1){print("<tr>"); } if($i>$first_day){ print("<td>".($i-$first_day)."</td>"); }else{ print("<td>&nbsp;</td>"); } if($i%7==0){print("</tr>");} } ?> </table> </body> </html>

    • ベストアンサー
    • PHP
  • 日付 yymmdd

    今日の日付をたとえば2007年12月13日のときは071213と表記させたいと思い、 $today = mktime (0,0,0,date("m") ,date("d")+1,date("Y")); $TODAY = date("ymd",today); としたのですが上手くいきません。 出力は700101となってしまいます。 どうすればよいでしょうか?

    • ベストアンサー
    • PHP
  • date関数で、曜日を日本語表示でループさせる。

    いつもお世話になります。 さて、date関数で、曜日を日本語表示でループさせ、日曜日だけ外す方法で悩んでおります。 今日から、順番に日付を表示させるのは、下記でできたのですが、 <?PHP $nday = mktime(); for($i=0;$i<5;$i++){ print "<option>".date("m月d日 (D)", mktime(0,0,0,date("m"),date("d")+$i,date("y")))."<br />"; } ?> 例) 04月18日 (Wed) 04月19日 (Thu) 04月20日 (Fri) 04月21日 (Sat) 04月22日 (Sun) 日本語表示にさせようとすると、曜日がループしません。 <?PHP $nday = mktime(); $youbi = array("日","月","火","水","木","金","土"); for($i=0;$i<5;$i++){ print "<option>".date("m月d日 (".$youbi[date(w)].")", mktime(0,0,0,date("m"),date("d")+$i,date("y")))."<br />"; } ?> 例) 04月18日 (水) 04月19日 (水) 04月20日 (水) 04月21日 (水) 04月22日 (水) また、ここから日曜日だけ外すことはできますか? お手数ですが、ご教示ください。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 土日をカウントしない日付表示

    PHPで日付の表示方法で困っています。 今日から3日後の日付を表示するときに土日を含まないで表示させたいのです。本日12日ですので17日が表示されるようなPHPをご教授いただきたいです。 <?php echo date("m月d日",strtotime("+3 day"));?> だと単純に3日後ですし、 <?PHP $day = 60 * 60 * 24; $t=mktime(0,0,0,date("m"),date("d")+3,date("y")); if(date("w",$t)==6) $t += $day * 2; if(date("w",$t)==0) $t += $day ; echo date("m月d日",$t); ?> だとしても土日をカウントしているので、思うような結果に至っておりません。 よろしくお願いします。

    • ベストアンサー
    • PHP