52 lines
1.3 KiB
PHP
52 lines
1.3 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Lcobucci\Clock;
|
|
|
|
use DateMalformedStringException;
|
|
use DateTimeImmutable;
|
|
use DateTimeZone;
|
|
use InvalidArgumentException;
|
|
|
|
final class FrozenClock implements Clock
|
|
{
|
|
public function __construct(private DateTimeImmutable $now)
|
|
{
|
|
}
|
|
|
|
public static function fromUTC(): self
|
|
{
|
|
return new self(new DateTimeImmutable('now', new DateTimeZone('UTC')));
|
|
}
|
|
|
|
public function setTo(DateTimeImmutable $now): void
|
|
{
|
|
$this->now = $now;
|
|
}
|
|
|
|
/**
|
|
* Adjusts the current time by a given modifier.
|
|
*
|
|
* @param string $modifier @see https://www.php.net/manual/en/datetime.formats.php
|
|
*
|
|
* @throws InvalidArgumentException When an invalid format string is passed (PHP < 8.3).
|
|
* @throws DateMalformedStringException When an invalid date/time string is passed (PHP 8.3+).
|
|
*/
|
|
public function adjustTime(string $modifier): void
|
|
{
|
|
$modifiedTime = @$this->now->modify($modifier);
|
|
|
|
// PHP < 8.3 won't throw exceptions on invalid modifiers
|
|
if ($modifiedTime === false) {
|
|
throw new InvalidArgumentException('The given modifier is invalid');
|
|
}
|
|
|
|
$this->now = $modifiedTime;
|
|
}
|
|
|
|
public function now(): DateTimeImmutable
|
|
{
|
|
return $this->now;
|
|
}
|
|
}
|