JCC Express

Digging Deeper

Carbon

Introduction

JCC Express MVC provides a fluent date/time utility through the Carbon class, inspired by Laravel's Carbon and backed by date-fns.

TypeScript
import { Carbon } from "jcc-express-mvc/Core/Date";

Creating instances

TypeScript
Carbon.now();                          // current date and time
Carbon.today();                        // today at 00:00:00
Carbon.yesterday();                    // yesterday at 00:00:00
Carbon.tomorrow();                     // tomorrow at 00:00:00
Carbon.startOfWeek();                  // start of current week
Carbon.startOfMonth();                 // start of current month
Carbon.startOfYear();                  // start of current year

Carbon.create(2025, 11, 21);           // Nov 21 2025 00:00:00
Carbon.create(2025, 11, 21, 14, 30);  // Nov 21 2025 14:30:00

new Carbon('2025-11-21');              // from ISO string
new Carbon(1732147200000);             // from timestamp

Formatting

TypeScript
const c = Carbon.now();

c.format('yyyy-MM-dd');        // '2025-11-21'
c.format('MMMM dd, yyyy');     // 'November 21, 2025'
c.toDateString();              // '2025-11-21'
c.toTimeString();              // '10:30:45'
c.toDateTimeString();          // '2025-11-21 10:30:45'
c.toISOString();               // '2025-11-21T10:30:00.000Z'

Addition

TypeScript
Carbon.now().addDays(5);
Carbon.now().addDay();
Carbon.now().addWeeks(2);
Carbon.now().addWeek();
Carbon.now().addMonths(3);
Carbon.now().addMonth();
Carbon.now().addYears(1);
Carbon.now().addYear();
Carbon.now().addHours(6);
Carbon.now().addMinutes(30);
Carbon.now().addSeconds(45);

All addition methods return this and are chainable:

TypeScript
Carbon.now().addDays(1).addHours(3).format('yyyy-MM-dd HH:mm');

Subtraction

TypeScript
Carbon.now().subDays(5);
Carbon.now().subDay();
Carbon.now().subWeeks(2);
Carbon.now().subMonth();
Carbon.now().subYears(1);
Carbon.now().subHours(6);
Carbon.now().subMinutes(30);
Carbon.now().subSeconds(45);

Start / End of period

TypeScript
Carbon.now().startOfDay();    // 00:00:00.000
Carbon.now().endOfDay();      // 23:59:59.999
Carbon.now().startOfWeek();
Carbon.now().endOfWeek();
Carbon.now().startOfMonth();
Carbon.now().endOfMonth();
Carbon.now().startOfYear();
Carbon.now().endOfYear();

Comparison

TypeScript
const c = new Carbon('2025-06-15');

c.isBefore('2025-12-01');      // true
c.isAfter('2025-01-01');       // true
c.isEqual('2025-06-15');       // true

c.isSameDay('2025-06-15');
c.isSameWeek('2025-06-12');
c.isSameMonth('2025-06-01');
c.isSameYear('2025-01-01');

c.isToday();
c.isTomorrow();
c.isYesterday();
c.isWeekend();
c.isWeekday();
c.isFuture();
c.isPast();
c.isThisWeek();
c.isThisMonth();
c.isThisYear();

c.compare('2025-12-01');  // -1 (before), 0 (equal), 1 (after)

Differences

TypeScript
const a = new Carbon('2025-01-01');
const b = new Carbon('2025-06-15');

a.diffInDays(b);       // number of days
a.diffInWeeks(b);
a.diffInMonths(b);
a.diffInYears(b);
a.diffInHours(b);
a.diffInMinutes(b);
a.diffInSeconds(b);

Carbon.now().subDays(3).diffForHumans();  // "3 days ago"
Carbon.now().addDays(5).diffForHumans();  // "in 5 days"

Getters

TypeScript
const c = Carbon.now();

c.getYear();        // e.g. 2025
c.getMonth();       // 0–11 (0 = January)
c.month();          // 1–12 (1 = January)
c.getDay();         // day of month (1–31)
c.day();
c.getDayOfWeek();   // 0 = Sunday, 6 = Saturday
c.dayOfWeek();
c.getHour();
c.hour();
c.getMinute();
c.minute();
c.getSecond();
c.getTimestamp();   // milliseconds since epoch

Setters

TypeScript
Carbon.now().setTime(14, 30, 0);    // sets to 14:30:00

Carbon.now().set({ year: 2026, month: 0, date: 1 });  // Jan 1 2026

Carbon.now().setTimezone('America/New_York');
Carbon.now().setTimezone('Asia/Tokyo');

setTimezone accepts any IANA timezone identifier. The underlying moment in time is unchanged; getters return values in the specified timezone.


Cloning and conversion

TypeScript
const original = Carbon.now();
const copy = original.clone();   // independent copy

original.toDate();               // native JavaScript Date object

Static utilities

TypeScript
Carbon.diff('2025-01-01', '2025-06-15');  // difference in days

Carbon.max(['2025-01-01', '2025-06-15', '2024-12-31']);  // Carbon for 2025-06-15
Carbon.min(['2025-01-01', '2025-06-15', '2024-12-31']);  // Carbon for 2024-12-31

Carbon.parse('2025-11-21');                      // ISO format
Carbon.parse('11/21/2025', 'MM/dd/yyyy');        // custom format

Summary

  • Import Carbon from jcc-express-mvc/Core/Date.
  • All mutation methods return this for chaining.
  • Use clone() before mutating if you need to preserve the original.
  • getMonth() returns 0–11; use month() for the 1–12 variant.
  • diffForHumans() produces human-readable relative strings like "3 days ago".