【问题标题】:Laravel Carbon using diffInDays and now() [duplicate]Laravel Carbon 使用 diffInDays 和 now() [重复]
【发布时间】:2020-10-15 13:55:05
【问题描述】:

我设法解决了我之前的问题,即计算从due_date 到今天的剩余天数。我目前面临的问题是即使due_date 已经通过,但仍在计算不同的日子。假设我想让输出类似于Overdue。为了更清楚,我展示了下面的例子:

对于第三个,假设剩余天数应该为负数或显示Overdue,因为今天的日期是 2020 年 10 月 15 日。我认为其他2是正确的?那么我该如何解决呢?

投诉表

id
defect_id
created_at (date)
due_date (date)
updated_at (timestamp)

投诉控制器

public function store(Request $request)
    {
        if (count($request->defect_id) > 0) {
            foreach($request->defect_id as $item=>$v) {
                $data = array(    
                    'defect_id' => $request->defect_id[$item],               
                    'created_at' => Carbon::today()->toDateString(),
                    'due_date' => Carbon::today()->addDays(30),
                    'updated_at' => Carbon::now()->toDateTimeString(),
                );

                Complaint::insert($data);
            }
        }
        return redirect('/report-form')->with('success','Your report is submitted!');

index.blade.php

<div class="panel-heading">
   <h3 class="panel-title"><strong>Pending Report</strong></h3>
</div>
<div class="panel-body">
    <table class="table table-hover" id="report-table">
        <thead>
           <tr>
              <th>Types of Defect</th>
              <th>Report Date</th>
              <th>Due Date</th>
              <th>Days Left</th>
              <th></th>
           </tr>
        </thead>
        @foreach($complaint as $c)
           <tr>
              <td>{{$c->defect->name}}</td>
              <td>{{$c->created_at->format("d/m/yy")}}</td>
              <td>{{date('d/m/yy', strtotime($c->due_date))}}</td>
              @if( \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) <= 10 && \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) > 0 )
                  <td class="text-danger">{{ \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) }} days</td>
              @elseif( \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) > 10)
                  <td class="text-success">{{ \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) }} days</td>
              @else
                  <td class="text-danger">Overdue</td>
              @endif
              <td><a href="/report/{{$c->id}}/view" class="btn btn-primary">View</a></td>
           </tr>
        @endforeach
    </table>
</div>

模型中没有为date 声明任何内容。我希望有人教我,并一一告诉我我需要做什么。

--更新--

@if( \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) <= 10 && \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) > 0 )
    <td class="text-danger">{{ \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) }} days</td>
 @elseif( \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) > 10)
    <td class="text-success">{{ \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) }} days</td>
@elseif( \Carbon\Carbon::parse($c->due_date)->diffInDays(now()) < 0)
    <td class="text-success">{{ \Carbon\Carbon::parse($c->due_date)->diffInDays(now(), false) }} days</td>
@endif

【问题讨论】:

  • 你不认为你需要将parse($c-&gt;due_date)-&gt;diffInDays($c-&gt;created_at) 区别于created_at 而不是now() .?
  • 添加 false 作为第二个参数, echo $dt->diffInDays($dt->copy()->subMonth(), false); // -31 它将以负数返回天数。
  • created_at 是居民提出投诉的日期。承包商只有 30 天(已经在到期日存储)来修复缺陷。我使用now() 是因为我想提醒承包商看看今天日期和due_date 之间还剩多少天。你明白我的意思吗? @KamleshPaul
  • 所以在我的情况下我需要做{{ \Carbon\Carbon::parse($c-&gt;due_date)-&gt;diffInDays(now(), false) }}? @AnuratChapanond
  • 这能回答你的问题吗? Laravel and Carbon - DiffInDays If Statement

标签: php laravel php-carbon


【解决方案1】:

您需要提供 Carbon 日期作为diffInDays() 的第一个参数。所以,逻辑是:

$c->due_date->diffInDays(now(), false); // -29

或者,

now()->diffInDays($c->due_date, false); // 29

false 作为第二个参数使方法返回有符号值(positivenegative)。没有这个参数diffInDays() 将返回

示例

$i = $data->created_at; // 2020-10-21 11:31:37
$q = $i->diffInDays(now(), false); // now() = 2020-10-15 16:40:49
dd($q); // -6

【讨论】:

  • 是的,如果你看我的帖子,我已经在 --Update-- 下编辑了我的代码,我已经输入了false,但仍然没有任何改变。还是我放错地方了?
  • @ihz 我已经测试了这两个代码,并且两者都像上面的例子一样工作
  • 上面的例子是我想显示我得到的错误输出。对于最后一行,它不能正确地算作我想要的。应该是-6 days
  • @ihz,我检查了一下,得到了-6 作为输出,我编辑了我的答案并附上了我刚刚测试过的代码
【解决方案2】:

您可以尝试通过稍微分离逻辑来使其更清晰。

利用isPast()diffForHumans() carbon 方法。

然后根据事先制定的逻辑使用三元和 if 语句。

类似:

@foreach($complaint as $c)
    @php
        $dueDate = \Carbon\Carbon::parse($c->due_date);
        $dueSoon = $dueDate->diffInDays(now()) <= 10 && $dueDate->diffInDays(now()) > 0;
        $isPast = $dueDate->isPast();
    @endphp
    <tr>
        <td>{{$c->defect->name}}</td>
        <td>{{$c->created_at->format("d/m/yy")}}</td>
        <td>{{date('d/m/yy', strtotime($c->due_date))}}</td>
        <td class="{{ ($isPast || $dueSoon) ? 'text-danger' : 'text-success' }}">
            @if($isPast)
                Overdue
            @else
                {{ $dueDate->diffForHumans() }}
            @endif
        </td>
        <td><a href="/report/{{$c->id}}/view" class="btn btn-primary">View</a></td>
    </tr>
@endforeach
猜你喜欢
  • 2018-06-05
  • 2018-02-02
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2019-08-14
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多