如何减去 laravel 中时间输入的差值?

How to subtract and get difference between time inputs in laravel?

我正在 laravel 中构建一个小应用程序,该应用程序有一个日期和时间输入,我用它来计算给定任务的价格。我已经成功计算出日期差异,现在我正在尝试获取 PM 和 AM 格式的两个选定时间之间的差异,但我被卡住了。 我想要实现的是,当用户选择一个时间时,如下例所示;我得到以小时为单位的时差,如果是 3 小时或更多小时,我会给予一定的惩罚,请帮忙!

 array:4 [▼
  "pickup_date" => "2019-09-13"
  "pickup_time" => "11:37 AM"
  "dropoff_date" => "2019-09-14"
  "dropoff_time" => "10:37 PM"
 ]

您可以使用 Cabon diff()

在 tinker 中会像

$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5 — cli) by Justin Hileman
>>> \Carbon\Carbon::parse('2019-09-13 11:37 AM')->diff(\Carbon\Carbon::parse('20
19-09-11 10:23 PM'))
=> DateInterval {#3080
     interval: - 1d 13:14:00.0,
   }
>>>

您可以在您的代码中使用它。

小时差异

> \Carbon\Carbon::parse('2019-09-13 11:37 AM')->diffInHours(\Carbon\Carbon::parse('2019-09-11 10:2
3 PM'))
=> 37

你的if条件可以是

$diff = \Carbon\Carbon::parse('2019-09-13 11:37 AM')->diffInHours(\Carbon\Carbon::parse('2019-09-11 10:2
    3 PM'));

然后

if ( $diff > 3 ) {
    // do something
} else {
    // do something else
}

你可以使用 diffInHours 同样的,

$pickUp = Carbon::createFromFormat('Y-m-d h:i A', '2019-09-13 11:37 AM');//->toDateTimeString(); 
$dropOff = Carbon::createFromFormat('Y-m-d h:i A', '2019-09-14 10:37 PM');//->toDateTimeString(); 
echo $dropOff->diffInHours($pickUp);//->format('%H'); // Output: 35

碳默认包含在laravel中, 在你的控制器中确保你导入碳

use Carbon\Carbon;

在具体的方法中你可以这样做:

$dropoff = Carbon::parse($request->dropoff_date .' '. $request->dropoff_time);
$pickup = Carbon::parse($request->pickup_date .' '. $request->pickup_time);

if($dropoff->diffInHours($pickup) > 3){
  // penalty
}
// rest

Carbon docs中有更多详细信息

试试这个

 $start_date = new DateTime('2012-09-01 04:10:58');
 $since_start = $start_date->diff(new DateTime('2012-09-11 10:25:00'));
 echo $since_start->days.' days total<br>';
 echo $since_start->y.' years<br>';
 echo $since_start->m.' months<br>';
 echo $since_start->d.' days<br>';
 echo $since_start->h.' hours<br>';
 echo $since_start->i.' minutes<br>';
 echo $since_start->s.' seconds<br>';

它将显示输出 总共 x 天 年 z 个月 一天 b小时 c分钟 d 秒

你可以比较差异秒数

$times = array(
    "pickup_date" => "2019-09-13",
    "pickup_time" => "11:37 AM",
    "dropoff_date" => "2019-09-14",
    "dropoff_time" => "10:37 PM"
);
$diff_in_seconds = strtotime($times["dropoff_date"] . " " . $times["dropoff_time"]) - strtotime($times["pickup_date"] . " " . $times["pickup_time"]);
if($diff_in_seconds > 10800){   // 3h -> 10800s
    // do something
}

如果你不想使用Carbon包,你可以使用下面的解决方案,这是procedural/functional方式,PHP也有面向对象的类来实现相同的。

$time = [
  "pickup_date" => "2019-09-13",
  "pickup_time" => "11:37 AM",
  "dropoff_date" => "2019-09-14",
  "dropoff_time" => "10:37 PM",
 ];

extract($time);

$pickup_datetime = date_create_from_format ( 'Y-m-d h:i a',$pickup_date.' '.$pickup_time);
$dropoff_datetime = date_create_from_format ( 'Y-m-d h:i a',$dropoff_date.' '.$dropoff_time);

$interval = date_diff($dropoff_datetime,$pickup_datetime);
$hours = date_interval_format($interval, '%h');