2

我正在 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"
 ]
4

6 回答 6

4

你可以使用卡本diff()

在修补程序中,它会像

$ 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
}
于 2019-09-10T09:18:44.870 回答
2

你可以使用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
于 2019-09-10T09:21:20.317 回答
1

碳默认包含在 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 文档中的更多详细信息

于 2019-09-10T09:24:56.213 回答
0

如果你不想使用Carbon包,你可以使用下面的解决方案,这是过程/功能的方式,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');
于 2019-09-10T10:28:17.743 回答
0

您可以比较差异秒

$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
}
于 2019-09-10T09:46:23.550 回答
0

尝试这个

 $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 天总计 y 年 z 月 a 天 b 小时 c 分钟 d 秒

于 2019-09-10T09:44:38.033 回答