问题描述
我设法解决了之前的问题,该问题计算了从due_date
到今天为止的剩余天数。我目前面临的问题是即使due_date
已经通过,但仍在计算不同的日子。假设我想使输出类似Overdue
。为了更清楚,我显示以下示例:
对于第三个日期,假定剩余日期应为负数或显示Overdue
,因为今天的日期是2020年10月10日。我认为其他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
解决方法
您需要提供一个 Carbon 日期作为diffInDays()
的第一个参数。因此,逻辑将是:
$c->due_date->diffInDays(now(),false); // -29
或者,
now()->diffInDays($c->due_date,false); // 29
false
作为第二个参数使该方法返回带符号的值(正或负)。如果没有此参数,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
,
您可以尝试通过稍微分离逻辑来使其变得更整洁。
使用isPast()
和diffForHumans()
碳方法。
然后根据事先确定的逻辑使用三元和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