Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Carbon Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require nesbot/carbon
    

    Laravel users: Already included in the framework.

  2. 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');
    
  3. Where to Look First:

    • Carbon API Docs
    • Laravel’s Carbon facade (e.g., Carbon::now())
    • Common methods: parse(), format(), addX(), diff(), isX()

Implementation Patterns

Core Workflows

1. Date Parsing & Creation

  • From strings:
    Carbon::parse('2023-12-25 14:30:00'); // Flexible formats
    Carbon::create(2023, 12, 25); // Year, month, day
    
  • From timestamps:
    Carbon::createFromTimestamp(1703561200); // Unix timestamp
    

2. Manipulation

  • Add/subtract:
    $date->addDays(5); // Fluent
    $date->subHours(2);
    
  • Intervals:
    $date->add(new DateInterval('P2Y3M')); // ISO 8601
    

3. Comparison

  • Relative checks:
    if ($date->isToday()) { ... }
    if ($date->isAfter(Carbon::now()->addDays(30))) { ... }
    
  • Diff:
    $diff = $date->diff(Carbon::now()); // CarbonPeriod
    $diff->days; // 15
    

4. Localization

  • Format with locale:
    $date->setLocale('fr')->format('l, d F Y'); // "lundi, 25 décembre 2023"
    
  • Relative time:
    $date->diffForHumans(); // "in 2 days"
    

5. Timezones

  • Switch timezones:
    $date->timezone('Asia/Tokyo');
    
  • Get timezone info:
    $date->getTimezone()->getName(); // "America/New_York"
    

6. Laravel-Specific Patterns

  • Eloquent timestamps:
    $model->created_at = Carbon::now(); // Auto-converts to Carbon
    
  • Request handling:
    $date = Carbon::parse($request->input('date'));
    
  • Macros (custom methods):
    Carbon::macro('isWeekend', function () {
        return $this->isFriday() || $this->isSaturday() || $this->isSunday();
    });
    

7. Testing

  • Freeze time:
    Carbon::freeze(Carbon::parse('2023-01-01'));
    
  • Assertions:
    $this->assertTrue($date->isToday());
    

Integration Tips

  1. Replace DateTime Globally: Use Carbon in constructors and methods to ensure consistency:

    public function __construct() {
        $this->date = Carbon::now(); // Instead of new DateTime()
    }
    
  2. 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
    
  3. Use CarbonPeriod for Ranges:

    $period = CarbonPeriod::create('2023-01-01', '2023-12-31', '1 day');
    foreach ($period as $date) { ... }
    
  4. Custom Formatters: Create reusable formatters for UI layers:

    function formatDate($date, string $format = 'Y-m-d') {
        return Carbon::parse($date)->format($format);
    }
    
  5. Macros for Business Logic: Extend Carbon with domain-specific methods:

    Carbon::macro('isBusinessDay', function () {
        return !$this->isWeekend() && !$this->isHoliday();
    });
    

Gotchas and Tips

Pitfalls

  1. Locale Conflicts:

    • Carbon uses PHP’s locale settings. Ensure your server’s setlocale() matches expected behavior.
    • Fix: Explicitly set locale:
      Carbon::setLocale('en_US');
      
  2. Timezone Ambiguity:

    • Parsing strings without timezones defaults to UTC. Use Carbon::parse($string, $timezone) to avoid surprises.
    • Example:
      Carbon::parse('2023-12-25 01:30', 'America/New_York'); // Not UTC!
      
  3. Immutable vs. Mutable:

    • Carbon 3.x introduced immutable instances. Use copy() to avoid unintended mutations:
      $newDate = $date->copy()->addDays(1); // Safe
      
  4. Daylight Saving Time (DST):

    • Timezone transitions can cause edge cases (e.g., repeated hours). Test with Carbon::createFromTimezone():
      Carbon::createFromTimezone('America/New_York', '2023-03-12 02:30');
      
  5. Performance with Large Datasets:

    • Avoid parsing strings in loops. Cache parsed dates or use timestamps:
      // 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);
      
  6. Macro Type Safety:

    • Macros lose static analysis support. Document return types:
      Carbon::macro('isWeekend', function () {
          // @return bool
          return $this->isFriday() || $this->isSaturday() || $this->isSunday();
      });
      
  7. Serialization:

    • Carbon instances serialize to strings. Use Carbon::parse($serialized) to restore:
      $serialized = serialize($date);
      $restored = Carbon::parse(unserialize($serialized));
      

Debugging Tips

  1. Check Locale:

    Carbon::getLocale(); // Debug current locale
    
  2. Inspect Timezone:

    $date->timezone->getName(); // Debug timezone
    
  3. Format for Debugging:

    $date->toDateTimeString(); // ISO 8601 with timezone
    
  4. Use dump(): Laravel’s dump() auto-formats Carbon:

    dump($date); // Pretty-prints Carbon instance
    

Extension Points

  1. 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);
    });
    
  2. Override Defaults: Configure Carbon globally in bootstrap/app.php:

    Carbon::setLocale('fr');
    Carbon::setDefaultTimezone('Europe/Paris');
    
  3. Extend with Traits: Add methods to specific classes:

    use Carbon\Traits\DateTimeTrait;
    
    class MyDate extends \Carbon\Carbon {
        use DateTimeTrait;
    
        public function isCustomCondition() { ... }
    }
    
  4. Create Custom Formatters: Extend formatting logic:

    Carbon::macro('formatCustom', function () {
        return $this->format('Y-m-d (l)') . ' - ' . $this->diffForHumans();
    });
    

Laravel-Specific Quirks

  1. Eloquent Timestamps:
    • Eloquent auto-converts created_at/updated_at to Carbon, but raw DateTime may slip in
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
calmfox/watch-sylius
damienfern/grpc-symfony-bundle
atoolo/index-bundle
atoolo/genai-bundle
coprotoai/laravel-ticket
davidjln/llm-carbon-bundle
cryonighter/valid-request-bundle
coolms/taxonomy-bundle
coolms/field-bundle
articulate-orm/symfony
aaix/laravel-tall-architect
ephoto/akeneo-connector
emmanuelballery/eb-plantumlbundle
emielburgman/symfony-visitor-beacon
emielburgman/symfony-visit-storage
emielburgman/symfony-security-headers
emielburgman/symfony-log-viewer
emarref/xdebug-bundle
emarref/pubnub-bundle
elriseio/finance-money-bundle