# Carbon (Date/Time) - [Introduction](#introduction) - [Creating Carbon Instances](#creating-carbon-instances) - [Formatting](#formatting) - [Manipulation](#manipulation) - [Comparison](#comparison) - [Human Readable](#human-readable) - [Model Integration](#model-integration) ## Introduction Magic includes Carbon, a powerful date/time utility inspired by PHP's Carbon library. Carbon provides an expressive, fluent API for creating, formatting, and manipulating dates and times. ```dart // Create, manipulate, and format dates fluently Carbon.now().addDays(5).format('MMMM d, yyyy'); // "January 20, 2024" // Human-readable differences carbon.diffForHumans(); // "2 days ago" ``` ## Creating Carbon Instances ```dart // Current date/time final now = Carbon.now(); // Parse from string final date = Carbon.parse('2024-01-15'); final datetime = Carbon.parse('2024-01-15 14:30:00'); final iso = Carbon.parse('2024-01-15T14:30:00Z'); // From DateTime final fromDart = Carbon.fromDateTime(DateTime.now()); // Specific dates final today = Carbon.today(); // Today at 00:00:00 final tomorrow = Carbon.tomorrow(); final yesterday = Carbon.yesterday(); ``` ## Formatting ```dart final date = Carbon.now(); // Standard formats date.format('yyyy-MM-dd'); // "2024-01-15" date.format('dd/MM/yyyy'); // "15/01/2024" date.format('MMMM d, yyyy'); // "January 15, 2024" date.format('EEEE'); // "Monday" date.format('h:mm a'); // "2:30 PM" // ISO 8601 date.toIso8601String(); // "2024-01-15T14:30:00.000Z" // Convenience methods date.toDateString(); // "2024-01-15" date.toTimeString(); // "14:30:00" date.toDateTimeString(); // "2024-01-15 14:30:00" ``` ### Format Tokens | Token | Output | Description | |-------|--------|-------------| | `yyyy` | 2024 | 4-digit year | | `yy` | 24 | 2-digit year | | `MMMM` | January | Full month name | | `MMM` | Jan | Abbreviated month | | `MM` | 01 | 2-digit month | | `dd` | 15 | 2-digit day | | `d` | 15 | Day of month | | `EEEE` | Monday | Full weekday name | | `EEE` | Mon | Abbreviated weekday | | `HH` | 14 | 24-hour hour | | `hh` | 02 | 12-hour hour | | `mm` | 30 | Minutes | | `ss` | 00 | Seconds | | `a` | PM | AM/PM | ## Manipulation ### Adding Time ```dart final date = Carbon.now(); date.addSeconds(30); date.addMinutes(15); date.addHours(2); date.addDays(5); date.addWeeks(2); date.addMonths(3); date.addYears(1); ``` ### Subtracting Time ```dart date.subSeconds(30); date.subMinutes(15); date.subHours(2); date.subDays(5); date.subWeeks(2); date.subMonths(3); date.subYears(1); ``` ### Start/End of Period ```dart date.startOfDay(); // 00:00:00 date.endOfDay(); // 23:59:59 date.startOfWeek(); // Monday 00:00:00 date.endOfWeek(); // Sunday 23:59:59 date.startOfMonth(); // First day 00:00:00 date.endOfMonth(); // Last day 23:59:59 ``` ## Comparison ```dart final date1 = Carbon.parse('2024-01-15'); final date2 = Carbon.parse('2024-01-20'); // Boolean comparisons date1.isBefore(date2); // true date1.isAfter(date2); // false date1.isSame(date2); // false // Special checks date.isToday(); date.isTomorrow(); date.isYesterday(); date.isWeekend(); date.isWeekday(); date.isFuture(); date.isPast(); // Between check date.isBetween(startDate, endDate); ``` ### Difference ```dart final start = Carbon.parse('2024-01-15'); final end = Carbon.parse('2024-01-20'); start.diff(end).inDays; // 5 start.diff(end).inHours; // 120 start.diff(end).inMinutes; // 7200 ``` ## Human Readable The `diffForHumans()` method returns a human-readable string: ```dart Carbon.now().subMinutes(5).diffForHumans(); // "5 minutes ago" Carbon.now().subHours(2).diffForHumans(); // "2 hours ago" Carbon.now().subDays(1).diffForHumans(); // "1 day ago" Carbon.now().subMonths(3).diffForHumans(); // "3 months ago" // Future dates Carbon.now().addDays(3).diffForHumans(); // "in 3 days" Carbon.now().addHours(1).diffForHumans(); // "in 1 hour" ``` ### Relative To Another Date ```dart final date1 = Carbon.parse('2024-01-15'); final date2 = Carbon.parse('2024-01-20'); date1.diffForHumans(date2); // "5 days before" date2.diffForHumans(date1); // "5 days after" ``` ## Model Integration Carbon integrates seamlessly with Eloquent models through attribute casting: ```dart class Post extends Model with HasTimestamps { @override Map get casts => { 'published_at': 'datetime', 'expires_at': 'datetime', }; // Typed getter Carbon? get publishedAt => getAttribute('published_at') as Carbon?; Carbon? get expiresAt => getAttribute('expires_at') as Carbon?; } ``` ### Using in Views ```dart // Display formatted date WText(post.publishedAt?.format('MMMM d, yyyy') ?? 'Draft') // Human-readable WText(post.publishedAt?.diffForHumans() ?? '') // "2 days ago" // Conditional display if (post.expiresAt?.isFuture() == true) { WText('Expires ${post.expiresAt!.diffForHumans()}'); } ``` ### HasTimestamps Mixin Models using `HasTimestamps` automatically get `createdAt` and `updatedAt` as Carbon instances: ```dart class User extends Model with HasTimestamps { // Automatically available: // Carbon? get createdAt // Carbon? get updatedAt } // Usage WText('Member since ${user.createdAt?.format('MMM yyyy')}'); ``` > [!TIP] > Use `diffForHumans()` in your UI for relative timestamps that are easier for users to understand.