如何比较两个Carbon时间戳?

129
我有两个时间戳,其中一个是我创建的edited_at,另一个是Laravel中的created_at。在数据库中,它们都是类型为timestamp且默认值为0000-00-00 00:00:00的字段。但是var_dump(edited_at variable)返回的是字符串,而var_dump(created_at variable)返回的是对象/Carbon。这些时间戳存在什么问题?
我需要将它们转换成integer格式并使用format('U')方法进行比较。但是我只能在Carbon对象上调用该方法。我该如何做?

你想要比较什么?你想知道哪个更旧/更新吗? - lukasgeiter
是的,我想比较旧版和新版。 - Hassan Saqib
2
http://carbon.nesbot.com/docs/#api-comparison - ceejayoz
4个回答

271

首先,Eloquent会自动将其时间戳(created_at, updated_at)转换为 Carbon 对象。您可以直接使用 updated_at,以获得这个好用的功能,或者在模型中的 $dates 属性中指定 edited_at

protected $dates = ['edited_at'];

现在回到你的实际问题。Carbon有一堆比较函数:

  • eq() 等于
  • ne() 不等于
  • gt() 大于
  • gte() 大于或等于
  • lt() 小于
  • lte() 小于或等于

用法:

if($model->edited_at->gt($model->created_at)){
    // edited at is newer than created at
}

4
如何仅比较日期而不比较时间? - geckob
4
最简单的方法可能是使用 $date1->toDateString() == $date2->toDateString() 进行比较。 - lukasgeiter
在使用时,请记得处理可空时间戳。Laravel 将把 SQL 中的 null 转换为 PHP 中的 null 而不是 Carbon 对象,否则会出现 call to a member function lt() on null 错误。 - okdewit
1
你应该在使用那些函数时,将$some_cabron_date->endOfDay()或$some_cabron_date->startOfDay()用于所需的操作。 - Williaan Lopes
那么,您可以使用普通的PHP运算符来比较Carbon和DateTime日期吗?@okdewit - Petar Vasilev
显示剩余2条评论

53

Carbon有一堆比较函数,带有助记名称:

  • equalTo()
  • notEqualTo()
  • greaterThan()
  • greaterThanOrEqualTo()
  • lessThan()
  • lessThanOrEqualTo()

用法:

 if($model->edited_at->greaterThan($model->created_at)){
     // edited at is newer than created at
 }

适用于 nesbot/carbon 1.36.2

如果您不确定使用的 Carbon 版本,请运行以下命令:

$composer show "nesbot/carbon"

文档:https://carbon.nesbot.com/docs/#api-comparison


4
首先,使用内置的Eloquent功能转换时间戳,如此答案所述。
然后,您可以直接使用Carbon的min()max()函数进行比较。 例如: $dt1 = Carbon::create(2012, 1, 1, 0, 0, 0); $dt2 = Carbon::create(2014, 1, 30, 0, 0, 0); echo $dt1->min($dt2); 这将echo出两个日期中较小的那个,这里是$dt1
请参见http://carbon.nesbot.com/docs/

4
这是我如何比较两个日期的方法,一个是now(),另一个来自表格。
@if (\Carbon\Carbon::now()->lte($item->client->event_date_from))
    .....
    .....
@endif

应该能正常工作。 我使用了Carbon提供的比较函数。


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