Store all dates in UTC database timestamps and use Eloquent date casting and Carbon accessors for display formatting.
Parsing date strings repeatedly inside Blade views with manual Carbon::parse($order->ordered_at)->format('M d, Y') calls is slow, repetitive, and fails if the column value is null.
Eloquent date casting automatically converts database timestamp strings into immutable Carbon instances upon retrieval.
Defining Date Casts on Models
namespace AppModels;
use Illuminate\Database\Eloquent\Model;
class Subscription extends Model
{
protected function casts(): array
{
return [
'starts_at' => 'datetime',
'ends_at' => 'datetime',
'trial_ends_at' => 'immutable_datetime',
];
}
}
Accessing Fluent Carbon Methods
Once cast, properties automatically return Carbon instances with full date math and comparison capabilities:
$subscription = Subscription::find(1);
// Date comparison
if ($subscription->ends_at->isPast()) {
$subscription->markAsExpired();
}
// Relative human diffs
echo $subscription->ends_at->diffForHumans(); // "in 3 days"
In Blade Templates
<p class="text-sm">
Subscription active until {{ $subscription->ends_at->format('M d, Y') }}
</p>
Summary
- Store timestamps in standard SQL
TIMESTAMP/DATETIMEformat in UTC. datetimeandimmutable_datetimecasts ensure attributes hydrate as Carbon instances.- Simplifies timezone conversions, relative formatting, and chronological comparisons.
Tags:
Laravel Eloquent Carbon Dates