0

Zend_Date間隔を表す2 つがあります。

$start = new Zend_Date($punch->getStart());
$end = new Zend_Date($punch->getEnd());

$nbHours = $start->sub($end , Zend_Date::HOUR);
$nbMinutes = $start->sub($end , Zend_Date::MINUTE);

$hoursTotal = $nbHours->get(Zend_Date::HOUR);
$minutesTotal = $nbMinutes->get(Zend_Date::MINUTE);

Zend_Date間隔が24 時間を超える場合に、曜日ごとに間隔を分割する簡単な方法はありますか?

たとえば、月曜日の午前 8 時から火曜日の午後 4 時 30 分までの間隔がある場合、monday = 16handを含む配列が必要tuesday = 16:30です。

4

1 に答える 1

1

これにはZend_Dateを使用する必要はありません。実際、使用しない方がよいでしょう。代わりに、PHPの日付/時刻クラスを使用する必要があります。

私があなたの質問を正しく理解しているなら、あなたは一連の日とその日の労働時間を望んでいます。

私は最初にあなたのコード例を反映するためにモッククラスを作成しました、私はそれがタイムスタンプを返すと仮定しました:-

class Punch
{
    public function getStart()
    {
        return time();
    }

    public function getEnd()
    {
        return strtotime('+36 hours 45 minutes');
    }
}

次に、 DateTimeオブジェクトを設定します-

$Punch = new Punch();
$start = new DateTime();
$start->setTimestamp($Punch->getStart());
$end = new DateTime();
$end->setTimestamp($Punch->getEnd());

次に、DateIntervalオブジェクトを使用して、反復可能なDatePeriodを生成します:-

$interval = new DateInterval('PT1M');
$minutes = new DatePeriod($start, $interval, $end);

次に、毎日の作業分数を数えて繰り返します。-

$format = 'l';
foreach($minutes as $minute){
    if(!isset($result[$minute->format($format)])) $result[$minute->format($format)] = 0;
    $result[$minute->format($format)]++;
}

受け入れ可能なフォーマットについては、マニュアルページを参照してください。

これで、1日の作業時間数がわかりました。これらを時間に変換するのは簡単です:-

foreach($result as $key => $r){
    $result[$key] = $r/60;
}
var_dump($result);

出力(明らかに、異なる時間に実行すると異なる結果が得られます):-

array
  'Monday' => float 17.483333333333
  'Tuesday' => float 19.266666666667

したがって、月曜日は17.48時間、火曜日は19.27時間でした。

または:-

foreach($result as $key => $r){
    $result[$key] = floor($r/60) . ':' . $r % 60;
}

それがあなたが望むものに近い場合、次の出力を与えるでしょう:-

array
  'Monday' => string "17:29"
  'Tuesday' => string "19:16"

それは私がそれをすることを考えることができる最も簡単な方法です。

于 2012-09-16T18:50:27.603 に答える