DownloadUsage
Make your objects depend on the Esi\Clock\ClockInterface interface.
You can then use SystemClock to retrieve the current time or FrozenClock to retrieve a specific time.
For example:
<?php
declare(strict_types=1);
use Esi\Clock\ClockInterface;
use Esi\Clock\FrozenClock;
use Esi\Clock\SystemClock;
class MyCoolObject
{
public function __construct(private ClockInterface $clock) {}
public function getCurrentTime(): \DateTimeImmutable
{
return $this->clock->now();
}
public function freezeTime(): FrozenClock
{
if ($this->clock instanceof SystemClock) {
return $this->clock->freeze();
}
return $this->clock->now();
}
// ...
}
<?php
declare(strict_types=1);
use Esi\Clock\SystemClock;
// ...
// ...
$clock = new MyCoolObject(new SystemClock('America/New_York'));
\var_dump($clock->getCurrentTime());
/*
class DateTimeImmutable#6 (3) {
public $date =>
string(26) "2024-04-10 13:46:30.724222"
public $timezone_type =>
int(3)
public $timezone =>
string(16) "America/New_York"
}
*/
$frozenClock = $clock->freezeTime();
$now = $frozenClock->now();
\var_dump($now);
/*
class DateTimeImmutable#7 (3) {
public $date =>
string(26) "2024-04-10 13:46:30.727716"
public $timezone_type =>
int(3)
public $timezone =>
string(16) "America/New_York"
}
*/
\sleep(5);
$stillNow = $frozenClock->now();
\var_dump($stillNow);
/*
class DateTimeImmutable#7 (3) {
public $date =>
string(26) "2024-04-10 13:46:30.727716"
public $timezone_type =>
int(3)
public $timezone =>
string(16) "America/New_York"
}
*/
SystemClock
Object that will return the current time based on the given timezone. The timezone passed to the constructor of SystemClock can either be a
string of the timezone identifier, or a DateTimeZone object.
Create a new system clock:
<?php
declare(strict_types=1);
use Esi\Clock\SystemClock;
/
* You can either create your own \DateTimeZone object to pass to the SystemClock, or
* you can pass the timezone string. E.g.:
*
* @see https://www.php.net/datetimezone
*
* $clock = new SystemClock('America/New_York');
*/
$timezone = new \DateTimeZone('America/New_York');
$clock = new SystemClock($timezone);
$now = $clock->now();
/
* You can also make use of either `fromUtc()` or `fromSystemTimezone()`
*/
// Create a clock using UTC
$clock = SystemClock::fromUtc();
$now = $clock->now();
// Or the default system timezone
$clock = SystemClock::fromSystemTimezone();
$now = $clock->now();
FrozenClock
Test object that always returns a fixed time object. When creating a FrozenClock, it must be passed a \DateTimeImmutable object in its constructor.
See DateTimeImmutable at php.net.
When creating the DateTimeImmutable object to pass into FrozenClock, if instantiated with no arguments it uses now to create the object with the current time.
You can also pass a date/time string to set the FrozenClock to a specific time.
You can use DateTimeImmutable directly, or:
Create a new frozen clock:
<?php
declare(strict_types=1);
use Esi\Clock\FrozenClock;
$now = new \DateTimeImmutable();
$clock = new FrozenClock($now);
\sleep(5);
$stillNow = $clock->now();
You can also set the frozen clock to a new time by using it's setTo() method, which also requires a DateTimeImmutable object:
<?php
declare(strict_types=1);
use Esi\Clock\FrozenClock;
$clock = new FrozenClock(new \DateTimeImmutable());
$now = $clock->now();
$clock->setTo(new \DateTimeImmutable('+3 hours'));
$newNow = $clock->now();
Or make use of the adjustTo() method which requires a valid date/time string to be passed.
Note: On PHP 8.3+, an invalid string will result in a DateMalformedStringException being thrown, otherwise it is an error.
<?php
declare(strict_types=1);
use Esi\Clock\FrozenClock;
$clock = new FrozenClock(new \DateTimeImmutable());
$now = $clock->now();
$clock->adjustTo('+3 hours');
$newNow = $clock->now();
You can also create a new frozen clock by freezing a system clock:
<?php
declare(strict_types=1);
use Esi\Clock\SystemClock;
$timezone = new \DateTimeZone('America/New_York');
$clock = new SystemClock($timezone);
$frozenClock = $clock->freeze();
$now = $clock->now();
\sleep(5);
$stillNow = $clock->now();
|