0

2つの日付の間の日付間隔の数を決定しようとしています。間隔は、月、日、時間、またはユーザーが選択したものであれば何でもかまいません。

現時点では再帰を使用する関数がありますが、再帰的なネスト制限のため、2つのポイントの間に100を超える間隔があると、これは機能しなくなります。

private static function findCurrentInterval($initialStartTimestamp, $intervalStrtotimeFormat, $now = null, $period = 1)
{
    if (is_null($now)){
        $now = time();
    }

    $endOfCurrentInterval = strtotime($intervalStrtotimeFormat, $initialStartTimestamp);

    if ($now > $initialStartTimestamp && $now < $endOfCurrentInterval){
        return new self($period);
    }else{
        # increment the period ID tracking variable
        $period++;
        return self::findCurrentInterval($endOfCurrentInterval, $intervalStrtotimeFormat, $now, $period);
    }
}

必要なのは、現在の時間間隔を表す整数値です。つまり、7日間隔に設定されていて、開始点から現在まで20日が経過すると、'3が返されます。 '、第3期になるからです。

おそらくDateIntervalを使用して、再帰なしでこれを行う方法はありますか?

注意:これが数日または数時間に制限されている場合、これは本当に簡単ですが、長さが可変である可能性がある月をサポートする必要があります。

4

2 に答える 2

0

これはうまくいくようです:

function findCurrentInterval($number, $type, $start, $end){

    $dt1 = DateTime::createFromFormat('Y-m-d H:i:s', $start);
    $dt2 = DateTime::createFromFormat('Y-m-d H:i:s', $end);
    $diff = $dt1->diff($dt2);

    $numDays = (int) $diff->format('%a');
    $numMonths = (int) $diff->format('%m');
    $numYears = (int) $diff->format('%y');
    $numHours = (int) $diff->format('%h');

    if ($numYears > 0){
        $numMonths += ($numYears * 12);
    }

    $numHours += $numDays * 24;


    switch ($type){
        case 'hours':
            return floor($numHours / $number);
        break;
        case 'days':
            return floor($numDays / $number);
        break;
        case 'months':
            return floor($numMonths / $number);
        break;
        default:
            throw new Exception('Interval type '.$type.' not implemented.');
    }

}

例:

echo findCurrentInterval(3, 'hours', '2012-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(7, 'days', '2012-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(1, 'months', '2012-01-01 00:00:00', '2012-08-01 00:00:00');

出力:

1704
30
7

と:

echo findCurrentInterval(3, 'hours', '2011-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(7, 'days', '2011-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(1, 'months', '2011-01-01 00:00:00', '2012-08-01 00:00:00');

出力:

4624
82
19
于 2012-08-03T10:05:30.993 に答える
0

これはあなたにとって非常に助けになります

これを試して

//日ベース

$start_date = '20-07-2012';
$end_date = '22-07-2012';
$start = strtotime($start_date);
$end = strtotime($end_date);
$interval = 2;
$out='';
$int = 24*60*60*$interval;
for($i= $start;$i<= $end; $i += $int ){

    echo date('d-m-Y',$i).'<br />';
}

//月のベース

$start_date = '20-07-2012';
$end_date = '22-12-2012';
$start = strtotime($start_date);
$end = strtotime($end_date);
$interval = 2;

$int = 30*24*60*60*$interval;
for($i= $start;$i<= $end; $i += $int ){

    echo date('d-m-Y',$i).'<br />';
}

//時間ベース

$start_date = '20-07-2012';
$end_date = '22-12-2012';
$start = strtotime($start_date);
$end = strtotime($end_date);
$interval = 2;

$int = 60*60*$interval;
for($i= $start;$i<= $end; $i += $int ){

    echo date('d-m-Y H:i:s',$i).'<br />';
}
于 2012-08-03T10:05:49.713 に答える