cakephp/chronos
Chronos is an immutable date and datetime library for PHP. It offers Chronos and ChronosDate objects that prevent accidental modification, keeping data predictable, and adds handy conveniences beyond native DateTime. Install via Composer with cakephp/chronos.
Chronos focuses on providing immutable date/datetime objects. Immutable objects help ensure that datetime objects aren't accidentally modified, keeping data more predictable.
Installing with composer:
$ composer require cakephp/chronos
For details on the (minimum/maximum) PHP version see version map.
<?php
require 'vendor/autoload.php';
use Cake\Chronos\Chronos;
printf("Now: %s", Chronos::now());
Chronos was originally compatible with Carbon but has diverged and no longer extends the PHP DateTime and DateTimeImmutable classes.
Immutable objects have a number of advantages:
With those benefits in mind, there are a few things you need to keep in mind when modifying immutable objects:
// This will lose modifications
$date = new Chronos('2015-10-21 16:29:00');
$date->modify('+2 hours');
// This will keep modifications
$date = new Chronos('2015-10-21 16:29:00');
$date = $date->modify('+2 hours');
PHP only offers datetime objects as part of the native extensions. Chronos adds
a number of conveniences to the traditional DateTime object and introduces
a ChronosDate object. ChronosDate instances their time frozen to 00:00:00 and the timezone
set to the server default timezone. This makes them ideal when working with
calendar dates as the time components will always match.
use Cake\Chronos\ChronosDate;
$today = new ChronosDate();
echo $today;
// Outputs '2015-10-21'
echo $today->modify('+3 hours');
// Outputs '2015-10-21'
Like instances of Chronos, ChronosDate objects are also immutable.
When you need to work with just times (without dates), use ChronosTime:
use Cake\Chronos\ChronosTime;
$time = new ChronosTime('14:30:00');
echo $time->format('g:i A'); // 2:30 PM
// Create from components
$time = ChronosTime::create(14, 30, 0);
// Arithmetic
$later = $time->addHours(2)->addMinutes(15);
ChronosTime is useful for recurring schedules, business hours, or any scenario
where the date is irrelevant.
Chronos provides setTestNow() to freeze time during testing:
use Cake\Chronos\Chronos;
// Freeze time for predictable tests
Chronos::setTestNow('2024-01-15 10:00:00');
$now = Chronos::now(); // Always 2024-01-15 10:00:00
// Reset to real time
Chronos::setTestNow(null);
For dependency injection, use ClockFactory which implements PSR-20:
use Cake\Chronos\ClockFactory;
$clock = new ClockFactory('UTC');
$now = $clock->now(); // Returns Chronos instance
// In your service
class OrderService
{
public function __construct(private ClockInterface $clock) {}
public function createOrder(): Order
{
return new Order(createdAt: $this->clock->now());
}
}
A more descriptive documentation can be found at book.cakephp.org/chronos/3/.
API documentation can be found on api.cakephp.org/chronos.
How can I help you explore Laravel packages today?