Проблема в вашем коде в том, что вы путаете объект возврата diff
.diff
Carbon не возвращает объект Carbon, но объект DateInterval.Этот объект не имеет функции sub
.Итак, один из способов сделать это - сначала вычесть время из углерода, а затем вычислить разность.Это было бы примерно так:
$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 не имеет класса миллисекунд ().Таким образом, вам придется создать свой собственный.Здесь 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: вы можетеиспользуйте:
$date = date("H:i", $diffMilli/1000);
Это основная идея.