我有两个代表间隔的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 = 16h
和tuesday = 16:30
的数组。
答案 0 :(得分:1)
你不需要为此使用Zend_Date,事实上最好不要这样做。您应该使用PHP中的date/time classes代替。
如果我正确地理解了你的问题,那么你需要一些日子和那些日子的工作时间。
我首先创建了一个模拟类来反映你的代码示例,我假设它正在返回时间戳: -
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)]++;
}
请参阅manual page了解可接受的格式。
我们现在拥有每天工作的分钟数,将它们转换为几小时是微不足道的: -
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"
这是我能想到的最简单的方法。