0

我有两个Zend_Date代表一个区间:

$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)]++;
}

有关可接受的格式,请参阅手册页

我们现在有了每天工作的分钟数,将它们转换为小时是微不足道的:-

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 回答