【问题标题】:Get delay hours and extra hours using Carbon library in Laravel在 Laravel 中使用 Carbon 库获取延迟时间和额外时间
【发布时间】:2018-12-15 06:19:27
【问题描述】:

我正在编写考勤报告,需要使用 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

【问题讨论】:

  • 这行$time-&gt;subtract(60, 'minutes');$time 而不是$time1 是错字吗?
  • 是的,现在是 $time1

标签: php laravel laravel-5 php-carbon


【解决方案1】:

您的代码中的问题是您混淆了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);

这是主要思想。

【讨论】:

  • 你好 Laerte,我实现了你的解决方案,在这种情况下我添加到 times
  • 结果如上图,正确的结果应该是07:10
  • 您使用什么代码将 $diffMilli 转换为小时和分钟?我在这里使用了相同的代码,如果我求和并且不使用subMinutes(60),结果是 7:10。
  • 我在最后添加了一个代码来将毫秒转换为日期。
  • 感谢 laerte,我错过了分区,如何输入时区(“美国/圣地亚哥”),我得到 04:10,应该是 07:10
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2015-12-19
  • 2018-03-13
  • 2023-01-18
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多