按星期几分割时间,间隔由两个Zend_Date定义

时间:2012-09-14 19:07:32

标签: php zend-framework zend-date

我有两个代表间隔的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 = 16htuesday = 16:30的数组。

1 个答案:

答案 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"

这是我能想到的最简单的方法。