Skip to content
Simple Analytics

ChronosDate ​

PHP provides only datetime classes that combine both date and time parts. Representing calendar dates can be awkward with DateTimeImmutable as it includes time and timezones, which aren't part of a "date".

Chronos provides ChronosDate which allows you to represent dates without time. The time is always fixed to 00:00:00 and is not affected by the server timezone or modifier methods.

Creating Instances ​

php
use Cake\Chronos\ChronosDate;

$today = ChronosDate::today();
$yesterday = ChronosDate::yesterday();
$tomorrow = ChronosDate::tomorrow();

// Parse from string
$date = ChronosDate::parse('2015-12-25');

// Create from components
$date = ChronosDate::create(2015, 12, 25);

// Parse with format
$date = ChronosDate::createFromFormat('m/d/Y', '12/25/2015');

// From array
$date = ChronosDate::createFromArray([
    'year' => 2015,
    'month' => 12,
    'day' => 25,
]);

Timezone for "Today" ​

Although ChronosDate uses a fixed internal timezone, you can specify which timezone to use for determining the current date:

php
// Takes the current date from Asia/Tokyo timezone
$today = ChronosDate::today('Asia/Tokyo');

This is useful when you need "today" in a specific timezone that differs from the server's timezone.

Time is Ignored ​

Time modifications have no effect on ChronosDate:

php
$today = ChronosDate::today();

// Time modifications are ignored
$today->modify('+1 hour');  // Still the same date

// Outputs just the date: '2015-12-20'
echo $today;

Available Methods ​

ChronosDate includes most of the same modifier and comparison methods as Chronos, but without time-related operations:

Modifiers ​

php
$date = ChronosDate::today();

// Add/subtract time periods
$date->addDays(5);
$date->subWeeks(2);
$date->addMonths(3);
$date->addYears(1);

// Jump to boundaries
$date->startOfMonth();
$date->endOfMonth();
$date->startOfYear();
$date->endOfYear();
$date->startOfWeek();
$date->endOfWeek();

// Day of week navigation
$date->next(Chronos::MONDAY);
$date->previous(Chronos::FRIDAY);
$date->firstOfMonth(Chronos::TUESDAY);
$date->lastOfMonth(Chronos::SUNDAY);

Comparisons ​

php
$date1 = ChronosDate::parse('2015-12-25');
$date2 = ChronosDate::parse('2015-12-31');

$date1->equals($date2);
$date1->lessThan($date2);
$date1->greaterThan($date2);
$date1->between($start, $end);

// Calendar checks
$date->isToday();
$date->isYesterday();
$date->isTomorrow();
$date->isFuture();
$date->isPast();
$date->isWeekend();
$date->isWeekday();
$date->isMonday();
// etc.

Differences ​

php
$date1->diffInDays($date2);
$date1->diffInWeeks($date2);
$date1->diffInMonths($date2);
$date1->diffInYears($date2);
$date1->diffInWeekdays($date2);
$date1->diffInWeekendDays($date2);

// Human readable
$date1->diffForHumans($date2);  // "6 days before"

Extracting Components ​

php
$date = ChronosDate::parse('2015-12-25');

$date->year;       // 2015
$date->month;      // 12
$date->day;        // 25
$date->dayOfWeek;  // 5 (Friday)
$date->dayOfYear;  // 359
$date->quarter;    // 4

Converting to Array ​

php
$date = ChronosDate::parse('2015-12-25');
$array = $date->toArray();
// [
//     'year' => 2015,
//     'month' => 12,
//     'day' => 25,
//     'dayOfWeek' => 5,
//     'dayOfYear' => 359,
// ]

Converting to DateTime ​

If you need a full datetime, you can convert to DateTimeImmutable:

php
$date = ChronosDate::parse('2015-12-25');

// Convert with optional timezone
$datetime = $date->toDateTimeImmutable();
$datetime = $date->toDateTimeImmutable('America/New_York');

// Alias
$datetime = $date->toNative();

Released under the MIT License.