如何比较两个Carbon时间戳?


83

我有两个时间戳,即我创建的edited_at和created_at(Laravel的)...在数据库中,两者的时间戳均为类型,默认值为0000-00-00 00:00:00 ...但是

var_dump(edited_at variable)给字符串。而var_dump(created_at variable)对象/碳。这些时间戳有什么问题?

使用format('U')转换为整数后,我必须比较两者。我只能在Carbon对象上调用此方法。我怎样才能做到这一点?


您到底想比较什么?您想知道哪个较旧/较新吗?
lukasgeiter 2015年

是的,我想露营(较新/较早)
Hassan Saqib

Answers:


189

首先,Eloquent自动将其时间戳(created_atupdated_at)转换为Carbon对象。您可以使用updated_at该功能,也可以edited_at在模型中的$dates属性中进行指定:

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
}

2
如何只比较日期而不是时间?
壁虎

3
@geckob最简单的方法可能是$date1->toDateString() == $date2->toDateString()
lukasgeiter

我正在测试,可以使用比较运算符比较Carbon对象。这是新功能吗?
JCarlosR

使用此方法时,请记住要处理可为空的时间戳。Laravel会将SQLnull转换为PHPnull而不是Carbon对象,您将获得call to a member function lt() on null
okdewit

您应该使用$ some_cabron_date-> endOfDay()或$ some_cabron_date-> startOfDay()并对该函数执行所需的操作
Williaan Lopes

21

Carbon具有一堆带有助记符名称的比较功能:

  • 等于()
  • 不等于()
  • 比...更棒()
  • GreaterThanOrEqualTo()
  • 少于()
  • 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


3

首先,使用此内置雄辩功能转换时间戳,如本答案所述

然后,您可以使用Carbonmin()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/


1

这就是我比较2个日期now()和表中日期的方式

@if (\Carbon\Carbon::now()->lte($item->client->event_date_from))
    .....
    .....
@endif

应该工作正确。我使用了Carbon提供的比较功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.