问题
I have two timestamps, edited_at which I created and created_at (Laravel\'s)... In database, both have type timestamp and default value 0000-00-00 00:00:00... But
var_dump(edited_at variable) is giving string. While var_dump(created_at variable) is object/Carbon. What is wrong with these timestamps?
I have to compare both after converting into integer using format(\'U\'). I can only call this method on Carbon Object. How can I do that?
回答1:
First, Eloquent automatically converts it's timestamps (created_at, updated_at) into carbon objects. You could just use updated_at to get that nice feature, or specify edited_at in your model in the $dates property:
protected $dates = ['edited_at'];
Now back to your actual question. Carbon has a bunch of comparison functions:
eq()equalsne()not equalsgt()greater thangte()greater than or equalslt()less thanlte()less than or equals
Usage:
if($model->edited_at->gt($model->created_at)){
// edited at is newer than created at
}
回答2:
Carbon has a bunch of comparison functions with mnemonic names:
- equalTo()
- notEqualTo()
- greaterThan()
- greaterThanOrEqualTo()
- lessThan()
- lessThanOrEqualTo()
Usage:
if($model->edited_at->greaterThan($model->created_at)){
// edited at is newer than created at
}
Valid for nesbot/carbon 1.36.2
if you are not sure what Carbon version you are on, run this
$composer show "nesbot/carbon"
documentation: https://carbon.nesbot.com/docs/#api-comparison
回答3:
First, convert the timestamp using the built-in eloquent functionality, as described in this answer.
Then you can just use Carbon's min() or max() function for comparison. For example:
$dt1 = Carbon::create(2012, 1, 1, 0, 0, 0);
$dt2 = Carbon::create(2014, 1, 30, 0, 0, 0);
echo $dt1->min($dt2);
This will echo the lesser of the two dates, which in this case is $dt1.
See http://carbon.nesbot.com/docs/
回答4:
extending on @lukasgeiter answer, the methods eq(), ne(), gt(), gte(), lt(), lte() not just compare the day but it also look at the time and timezone
>> $date->toArray();
{
"year": 2019,
"month": 2,
"day": 23,
"dayOfWeek": 6,
"dayOfYear": 53,
"hour": 7,
"minute": 39,
"second": 52,
"micro": 849616,
"timestamp": 1550907592,
"formatted": "2019-02-23 07:39:52",
"timezone": {
"timezone_type": 3,
"timezone": "UTC"
}
}
Time zone can be adjusted as
Carbon::parse($stringDate, new DateTimeZone('Asia/Dubai'))
to compare only the day
$date1->startOfDay()->eq($date2->startOfDay())
i couldn't use these methods, hope it helps someone else.
来源:https://stackoverflow.com/questions/29684111/how-to-compare-two-carbon-timestamps