【问题标题】:Best way to calculate time difference with the previous created_at - Laravel计算与先前 created_at 时间差的最佳方法 - Laravel
【发布时间】:2021-06-28 00:47:20
【问题描述】:

我有一个婴儿日志列表,我尝试自动计算之前的时间差,减去喂养间隔。

feedingInterval = 3h

例如

如果我在下午 5 点喂我的宝宝,如果我在晚上 7:50 再喂他一次。 他早了 10 分钟。

  • 超过 3 小时,绿色(+)表示宝宝睡得很好
  • 不到3小时,红色(-)表示宝宝会早吃,不宜太频繁。

我有这段代码

if($baby){

    $dateTime = new \DateTime();
    $date = $dateTime->format('Y-m-d');

    if(Request::get('date') != null) {
        $date = Request::get('date');
    }

    $yesterday = date('Y-m-d',strtotime("-1 days"));
    $logFromYesterday = BabyLog::where('type', $type)->whereDate('created_at', $yesterday )->orderBy('created_at', 'desc')->where('babyId',$baby->id)->get()->first();


    $babyLogs      = BabyLog::where('type', $type)->whereDate('created_at', '=', $date)->orderBy('created_at', 'desc')->where('babyId',$baby->id)->get();


    $logDetail = []; 
    $lastFeedStatus = 'n/a';
    foreach ($babyLogs as $i => $feed) {

        $id = $babyLogs[$i]->id;
        
        $t1 = $babyLogs[$i]->updated_at;

        if($i >= (count($babyLogs)-1)){

            if($logFromYesterday){
                $t2 = $logFromYesterday->updated_at;
            } else {
                $t2 = $date.' 00:00:00';
            }

        }else {
            $t2 = $babyLogs[$i+1]->updated_at;
        }

        // dd($t1,$t2);//

        $diffTime = abs(strtotime($t1) - strtotime($t2)); 
        $diffTime = $diffTime / ( 60 * 60 );

        if($type == 'feed'){
            $diffTime = $diffTime - $baby->feedingInterval;

            $diffTime        = round($diffTime,2);
            $diffTime        = $diffTime*60;
            $logDetailStatus = ($diffTime>0) ? "+" : "-";
            $diffTime        = $logDetailStatus.str_replace('-', '', $diffTime). "m ";

        } else {

            $diffTime = round($diffTime,2);
            $diffTime = $diffTime*60;
            $diffTime = str_replace('0', '',date('H\h', mktime(0,$diffTime))) . '';

        }
        
        $logDetail[$i]['id']  = $id;
        $logDetail[$i]['msg'] = $diffTime;


        if($i == 0){
            $lastFeedStatus = $diffTime;
        }

    }

    return $logDetail;

}

我只想四舍五入到分钟。

例如。 10.2 米 --> 10 米


我试过了

round($diffTime,2);

round($diffTime,1);

我明白了

例如。 10.2 米 --> 12 米

【问题讨论】:

  • 您有什么理由不使用 Carbon 吗? Carbon 使这些类型的计算变得容易得多。
  • @Praveesh 如果可以通过 PHP 实现,我更愿意这样做,Carbon 不会增加页面加载的权重吗?
  • Carbon 在 Laravel 加载时加载(Illuminate\Support\Carbon),Laravel 在内部使用它进行日期操作。所以如果你在这里也使用它不会对性能产生太大影响。
  • 如果你真的想使用 php,那么 dateTime() 或 strtotime() 是你的选择。

标签: php laravel laravel-7


【解决方案1】:

尝试使用 number_format():

<?php
    echo number_format("100.1234");
    echo number_format("100.50");
    echo number_format("100.890");
?>

结果将是:

100

101

101

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2020-09-26
    相关资源
    最近更新 更多