在 Laravel 中使用 Carbon 库获取延迟时间和额外时间
Get delay hours and extra hours using Carbon library in Laravel
我正在处理出勤报告,需要使用 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() )
总和错误图片:
相加两次
您的代码中的问题是您混淆了 diff
的 return 对象。 Carbon 的 diff
不是 return 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 class 没有 milliseconds() class。所以你必须创建自己的。在这里 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);
这是主要思想。
我正在处理出勤报告,需要使用 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() )
总和错误图片: 相加两次
您的代码中的问题是您混淆了 diff
的 return 对象。 Carbon 的 diff
不是 return 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 class 没有 milliseconds() class。所以你必须创建自己的。在这里 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);
这是主要思想。