您不需要为此使用 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"
这是我能想到的最简单的方法。