使用Carbon和Blade计算两个日期之间的差异

97

有人知道如何传递给定变量以替代Carbon的默认参数吗?

Carbon的文档说明:

// CARBON SAMPLE

$dtToronto = Carbon::createFromDate(2012, 1, 1, 'America/Toronto');
$dtVancouver = Carbon::createFromDate(2012, 1, 1, 'America/Vancouver');
echo $dtVancouver->diffInHours($dtToronto); // 3

我想在我的控制器中做类似这样的事情:

  // EXAMPLE

  $date = "2016-09-16 11:00:00";
  $datework = Carbon::createFromDate($date);
  $now = Carbon::now();
  $testdate = $datework->diffInDays($now);

并在 Blade 模板上检索它

  // VIEW ON BLADE

  <td> {{ $testdate }} </td>

你试图解释的问题到底是什么?你有遇到任何错误吗?它展示的值是否有误?我认为你的解决方案应该使用new Carbon($date)而不是Carbon::createFromDate($date) - Thomas Van der Veen
尝试使用Carbon::parseDate($date)而不是createFromDate - Filip Koblański
所以我正在尝试通过Blade来计算它:<td>{{Carbon\Carbon::now()->diffInDays($work['date']) }}</td> 但是我遇到了这个错误:Type error: Argument 1 passed to Carbon\Carbon::diffInDays() must be an instance of Carbon\Carbon, string given。所以我的变量$work['date']是由模型查询返回的结果,而不是一个Carbon对象... - user5120193
6个回答

190
你没有按照Carbon文档的示例操作。方法Carbon::createFromDate()需要四个参数:年、月、日和时区,而你正在尝试传递格式化的日期字符串。
如果你想从格式化的日期字符串创建Carbon对象,可以像这样使用类的构造函数:
$date = "2016-09-17 11:00:00";
$datework = new Carbon($date);

或者您可以使用静态的Carbon::parse()方法:

$date = "2016-09-17 11:00:00";
$datework = Carbon::parse($date);

为了您的目的,您可以使用这个完整的例子:
$date = Carbon::parse('2016-09-17 11:00:00');
$now = Carbon::now();

$diff = $date->diffInDays($now);

然后在你的 Blade 模板中:

<td> {{ $diff }} </td>

经过多次尝试,这是唯一有效的方法: {{ $diff = $datework->diffForHumans($now) }} 它直接在视图层计算,添加了HTML注释代码以删除Blade输出... - user5120193
@MarcoFacc 最好不要在视图模板中进行这些计算。 - iivannov
1
理想情况下,我想在自己的控制器内计算这些日期,但是我需要的信息是通过在视图层上对$work数组进行foreach循环检索的。我仍在尝试找到更清晰的解决方案,并将其放入控制器中,但目前为止我还没有找到更好的解决方案。 - user5120193
Carbon的diffInX()方法默认为现在,因此如果您要比较的时间是现在,则无需指定。 - Joel Mellon
这不包括开始日期。我想要从开始到结束的天数计数,例如日期16-25,我认为返回应该是10天。但实际返回了9天。 - Abdullah Iftikhar
显示剩余2条评论

15

刀片模板

更短的代码

{{ $diff = Carbon\Carbon::parse($data->last_updated)->diffForHumans() }}

结果:6分钟前


有没有可能以某种方式使用if条件语句。例如,如果($diff> 10),则打印$diff,否则打印“短时间金额”。 - Crypcode
@wajih,据我所知没有,但这是一个好问题,有时我也感觉需要类似的东西。 - CodeGuru

7
您可以通过以下方式使您的代码得到清理并删除已注释的代码:

<td>{{ $diff = Carbon\Carbon::parse($work['date'])->diffForHumans(Carbon\Carbon::now()) }} </td>

3

Carbon 意味着您不需要混合使用 PHP Datetime 和 Carbon。 一旦您拥有了Carbon类型的datetime,只需执行以下操作...

$comparisonTimeAsCarbon->diffAsCarbonInterval($theOtherTimeAsCarbon)

您可以将 diffAsCarbonInterval 更改为 diffAsSecondsdiffAsMinutes 等等。

diffForHumans 是我最喜欢的之一。

或者,使用以下代码选择您自己的格式...

$comparisonTimeAsCarbon->diff($theOtherTimeAsCarbon)->format('%I:%S')

Carbon 甚至让您添加文本而不是 Carbon 时间,但是我建议您在解析之前使用 Carbon,以防万一。


3

最短路径

我们可以直接在Blade中编写它

<span>{{ \Carbon\Carbon::parse( $start_date )->diffInDays( $end_date ) }}</span>

1

你可以直接在 Blade 模板中使用:

{{ (Carbon\Carbon::parse(Auth::user()->created_at))->diffInDays(Carbon\Carbon::now()) }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接