- ベストアンサー
経過期間計算で上手くいかない!
- 2つの日付間の経過期間を計算するプログラムでうまくいかない問題が発生しています。例えば、2000/1/1から2000/12/31の経過期間を計算すると、1年と1日ではなく1年になってしまいます。同じプログラムで2000/1/1から2003/12/31の経過期間を計算すると、4年になってしまうなど、上手くいく場合といかない場合が混在しています。
- プログラムの一部を以下に示します。
- プログラムは対象日と今日の日付をタイムスタンプに変換し、2つの日付間の差を計算しています。計算結果を年、月、日の形式に変換して表示します。ただし、計算結果が特定の条件の場合には修正を加えています。
- みんなの回答 (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)
ANo.1で確認を求めた者です。 連投で申し訳ありませんが、もう1つ確認させてください。 たとえば2007年3月1日~2008年2月28日は365日ですが、~2008年2月29日は366日になります。どちらを1年としますか?
原因はうるう年の計算をしていないことです。 まず、ご利用のPHP処理系がカレンダー関数をサポートしているかどうか、下記のスクリプトで確認をしてください。カレンダー関数が有無によって、書くべきスクリプトの量が大幅に変わりますので。 --------------------------- <?php echo 'カレンダー関数'; if (function_exists(cal_to_jd)) echo 'あり'; else echo 'なし'; ?>
お礼
<?php echo 'ccc '; if (function_exists(cal_to_jd)) echo 'abc '; else echo 'def'; ?> 日本語の部分を書き換えたのですが、 ccc abc と表示されました 両方1年丁度としたいのですが無理でしょうか? 閏年だけ366日で1年、それ以外は365日で1年で換算するようにしたいのです。