使用Laravel中的Carbon库获取延迟时间和额外时间

时间:2018-11-22 19:39:06

标签: php laravel laravel-5 php-carbon

我正在处理出勤报告,需要显示使用碳的延迟时间和加班时间,我计算时间In和TimeOut之间的时差,然后减去1小时(午餐时间),我要减去1小时。

第二,一旦上述准备就绪,我就需要计算员工的实际到达和离开时间,并获取差额以获取工作时间。

      $timeIn = Carbon::createFromFormat('H:i', $hra_entrada_m); //08:00 am
      $timeOut = Carbon::createFromFormat('H:i', $hra_salida_t);  //17:30 pm

      $time1 =  $timeIn->diff($timeOut);          <- 9:30
      $time1 =  $time1->subtract(60, 'minutes');     <- problem   
      return  $time1->format('%H:%i');            ->should display 8:30


      $employeeTimeIn = Carbon::createFromFormat('H:i', $emp_time_in); //08:15 am
      $employeeTimeOut = Carbon::createFromFormat('H:i', $emp_time_out); //17:40 pm
      $time2 =  $employeeTimeIn->diff($employeeTimeOut);  

现在要获取time1和time2之间的差异,我想将它们转换为毫秒,

      $hours_worked = ($time1->milliseconds() - $time2->milliseconds() )

总和错误的图像: adding two times

1 个答案:

答案 0 :(得分:0)

您的代码中的问题是您混淆了diff的返回对象。 Carbon的diff不会返回Carbon对象,而是返回DateInterval对象。该对象不具有sub功能。因此,一种方法是先从Carbon减去时间,然后计算diff。会是这样的:

$timeIn = Carbon::createFromFormat('H:i', '08:00'); //08:00 am
$timeOut = Carbon::createFromFormat('H:i', '17:30');  //17:30 pm

$time1 = $timeIn->diff($timeOut->subMinutes(60)); // <-8:30

第二个问题是DateInterval类没有milliseconds()类。因此,您必须创建自己的。您可以在http://php.net/manual/pt_BR/dateinterval.format.php处找到计算结果。因此,该函数将是:

function dateIntervalToMilli($interval)
{
    $days = $interval->format('%a');
    $seconds = 0;
    if($days){
        $seconds += 24 * 60 * 60 * $days;
    }
    $hours = $interval->format('%H');
    if($hours){
        $seconds += 60 * 60 * $hours;
    }
    $minutes = $interval->format('%i');
    if($minutes){
        $seconds += 60 * $minutes;
    }
    $seconds += $interval->format('%s');
    $milliseconds = $seconds * 1000;
    return $milliseconds;
}

现在,使用此功能,您可以执行以下操作:

$employeeTimeIn = Carbon::createFromFormat('H:i', '08:15'); //08:15 am
$employeeTimeOut = Carbon::createFromFormat('H:i', '17:40'); //17:40 pm
$time2 =  $employeeTimeIn->diff($employeeTimeOut);  

$t1Milli = dateIntervalToMilli($time1);
$t2Milli = dateIntervalToMilli($time2);

$diffMilli = $t1Milli - $t2Milli;

要将$diffMilli转换为H:i,可以使用:

$date = date("H:i", $diffMilli/1000);

这是主要思想。