アプリ版:「スタンプのみでお礼する」機能のリリースについて

2つの日付間の年月日を表示するプログラムを作成しているのですが上手くいきません
 例えば2000/1/1から2000/12/31の経過期間を出した場合、本来なら1年丁度にしたいのですが、1年と1日になってしまいます
 ですがこれが2000/1/1から2003/12/31だと丁度4年となったりしてしまい、上手くいく場合と上手くいかない場合がまちまちで困っています

以下はプログラムからprint関連を抜いたものです
<?php
$date = "2000/1/1";
$date2 = "2003/12/31";

//対象日と今日の日付をそれぞれ配列に格納
$Sday = split("/", $date);
$Lday = split("/", $date2);

//日付を計算用にタイムスタンプ(ミリ秒)へ変換

$SdayTime = mktime(0,0,0,$Sday[1] , $Sday[2] , $Sday[0]);
$LdayTime = mktime(0,0,0,$Lday[1] , $Lday[2] , $Lday[0]);

//2つの日付間の差(ミリ秒)を計算
$diffTime = $LdayTime - $SdayTime ;

//○年○ヶ月○日と表示したい場合
$diffYMD = (date("Y",$diffTime ) - 1970) . "year" . (date("m",$diffTime ) - 1) . "month" . (date("d",$diffTime )) . "day";

//print $diffYMD . "\n";

$diffY = (date("Y",$diffTime ) - 1970);//期間・年
$diffM = (date("m",$diffTime ) - 1);//期間・月
$diffD = (date("d",$diffTime ));//期間・日

if ($diffD < "10"){
$diffD = ltrim($diffD,"0");
}

if ($diffD == "31" && $diffM == "11"){
$diffD = 0;
$diffM = 0;
$diffY = $diffY + 1;
}

if ($diffM == 0 && $diffD == 0){
$diffYY = $diffY;
} else {
$diffYY = $diffY + 1;
}

?>

A 回答 (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));
?>
    • good
    • 0
    • good
    • 0

ANo.1で確認を求めた者です。


連投で申し訳ありませんが、もう1つ確認させてください。

たとえば2007年3月1日~2008年2月28日は365日ですが、~2008年2月29日は366日になります。どちらを1年としますか?
    • good
    • 0
この回答へのお礼

<?php
echo 'ccc ';
if (function_exists(cal_to_jd)) echo 'abc ';
else echo 'def';
?>

日本語の部分を書き換えたのですが、 ccc abc と表示されました

両方1年丁度としたいのですが無理でしょうか?
閏年だけ366日で1年、それ以外は365日で1年で換算するようにしたいのです。

お礼日時:2010/03/18 10:30

原因はうるう年の計算をしていないことです。



まず、ご利用のPHP処理系がカレンダー関数をサポートしているかどうか、下記のスクリプトで確認をしてください。カレンダー関数が有無によって、書くべきスクリプトの量が大幅に変わりますので。

---------------------------
<?php
echo 'カレンダー関数';
if (function_exists(cal_to_jd)) echo 'あり';
else echo 'なし';
?>
    • good
    • 0

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