nesbot/carbon
Carbon is a PHP DateTime extension for easy date/time parsing, formatting, arithmetic, timezones, and human-friendly differences. Common in Laravel, it adds a fluent API, helpers like now()/today(), and readable methods for complex date logic.
Installation:
composer require nesbot/carbon
Laravel users: Already included in the framework.
First Use Case:
Replace native DateTime with Carbon for immediate benefits:
use Carbon\Carbon;
// Parse a string
$date = Carbon::parse('2023-12-25');
// Format output
echo $date->format('Y-m-d H:i:s'); // "2023-12-25 00:00:00"
// Timezone-aware
$date->timezone('America/New_York');
Where to Look First:
Carbon facade (e.g., Carbon::now())parse(), format(), addX(), diff(), isX()Carbon::parse('2023-12-25 14:30:00'); // Flexible formats
Carbon::create(2023, 12, 25); // Year, month, day
Carbon::createFromTimestamp(1703561200); // Unix timestamp
$date->addDays(5); // Fluent
$date->subHours(2);
$date->add(new DateInterval('P2Y3M')); // ISO 8601
if ($date->isToday()) { ... }
if ($date->isAfter(Carbon::now()->addDays(30))) { ... }
$diff = $date->diff(Carbon::now()); // CarbonPeriod
$diff->days; // 15
$date->setLocale('fr')->format('l, d F Y'); // "lundi, 25 décembre 2023"
$date->diffForHumans(); // "in 2 days"
$date->timezone('Asia/Tokyo');
$date->getTimezone()->getName(); // "America/New_York"
$model->created_at = Carbon::now(); // Auto-converts to Carbon
$date = Carbon::parse($request->input('date'));
Carbon::macro('isWeekend', function () {
return $this->isFriday() || $this->isSaturday() || $this->isSunday();
});
Carbon::freeze(Carbon::parse('2023-01-01'));
$this->assertTrue($date->isToday());
Replace DateTime Globally:
Use Carbon in constructors and methods to ensure consistency:
public function __construct() {
$this->date = Carbon::now(); // Instead of new DateTime()
}
Leverage Laravel Facades:
Prefer Carbon::now() over now() for explicit Carbon instances:
$now = Carbon::now(); // Explicit
$now = now(); // Returns Carbon in Laravel, but less explicit
Use CarbonPeriod for Ranges:
$period = CarbonPeriod::create('2023-01-01', '2023-12-31', '1 day');
foreach ($period as $date) { ... }
Custom Formatters: Create reusable formatters for UI layers:
function formatDate($date, string $format = 'Y-m-d') {
return Carbon::parse($date)->format($format);
}
Macros for Business Logic: Extend Carbon with domain-specific methods:
Carbon::macro('isBusinessDay', function () {
return !$this->isWeekend() && !$this->isHoliday();
});
Locale Conflicts:
setlocale() matches expected behavior.Carbon::setLocale('en_US');
Timezone Ambiguity:
Carbon::parse($string, $timezone) to avoid surprises.Carbon::parse('2023-12-25 01:30', 'America/New_York'); // Not UTC!
Immutable vs. Mutable:
copy() to avoid unintended mutations:
$newDate = $date->copy()->addDays(1); // Safe
Daylight Saving Time (DST):
Carbon::createFromTimezone():
Carbon::createFromTimezone('America/New_York', '2023-03-12 02:30');
Performance with Large Datasets:
// Bad: Parse in loop
foreach ($dates as $dateStr) {
$date = Carbon::parse($dateStr); // Expensive!
}
// Good: Parse once
$dates = array_map(fn($d) => Carbon::parse($d), $dateStrings);
Macro Type Safety:
Carbon::macro('isWeekend', function () {
// @return bool
return $this->isFriday() || $this->isSaturday() || $this->isSunday();
});
Serialization:
Carbon::parse($serialized) to restore:
$serialized = serialize($date);
$restored = Carbon::parse(unserialize($serialized));
Check Locale:
Carbon::getLocale(); // Debug current locale
Inspect Timezone:
$date->timezone->getName(); // Debug timezone
Format for Debugging:
$date->toDateTimeString(); // ISO 8601 with timezone
Use dump():
Laravel’s dump() auto-formats Carbon:
dump($date); // Pretty-prints Carbon instance
Custom Macros: Add reusable methods globally:
Carbon::macro('isHoliday', function () {
$holidays = ['2023-12-25', '2023-01-01'];
return in_array($this->format('Y-m-d'), $holidays);
});
Override Defaults:
Configure Carbon globally in bootstrap/app.php:
Carbon::setLocale('fr');
Carbon::setDefaultTimezone('Europe/Paris');
Extend with Traits: Add methods to specific classes:
use Carbon\Traits\DateTimeTrait;
class MyDate extends \Carbon\Carbon {
use DateTimeTrait;
public function isCustomCondition() { ... }
}
Create Custom Formatters: Extend formatting logic:
Carbon::macro('formatCustom', function () {
return $this->format('Y-m-d (l)') . ' - ' . $this->diffForHumans();
});
created_at/updated_at to Carbon, but raw DateTime may slip inHow can I help you explore Laravel packages today?