【问题标题】:How to subtract and get difference between time inputs in laravel?如何在laravel中减去并获得时间输入之间的差异?
【发布时间】:2019-09-10 09:06:16
【问题描述】:

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

【问题讨论】:

  • 除此之外还有什么需要或无法使其工作的,请告诉我?

标签: php laravel date php-carbon laravel-6


【解决方案1】:

您可以使用卡邦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
}

【讨论】:

  • @princeallan 你真正想要什么,天差异,周差异,人类可读差异等?
  • 集成后效果很好,但我的问题是在我的代码中检查这些时间,我想在 if 语句中使用它
  • @princeallan 您可以将其转换为您想要的任何格式,您可以发布您的条件吗?
  • @princeallan 编辑了我的答案,以小时为单位显示差异。
  • 是的,谢谢,我意识到我也需要几天,所以我做了@if($diff > 24 && $diff % 24 && $diff > 3)
【解决方案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

【讨论】:

    【解决方案3】:

    Carbon 默认包含在 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

    【讨论】:

      【解决方案4】:

      试试这个

       $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 秒

      【讨论】:

        【解决方案5】:

        您可以比较差异秒数

        $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
        }
        

        【讨论】:

          【解决方案6】:

          如果你不想使用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');
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-04
            • 1970-01-01
            • 2014-05-04
            • 1970-01-01
            • 2020-03-04
            • 2021-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多