Hi

thank you Andreas, that mostly matches what I would have answered myself. I'll add my own nuance in a separate reply to Mirco directly.

On 2026-10-01 17:57, Andreas Heigl wrote:
But all that is obsoleted and irrelevant in the end as the Instant is based on the epoch which is based on UTC minus leap-seconds. At least as far as I understood Tim.

Yes, or “POSIX time”, which avoids the overloaded term UTC that could also refer to the UTC timezone. Timezones reintroduce “date and time” as a concept, which is not relevant to a point in time.

I have demonstrated it is impossible to write an adapter. Given the
constraint that only the PSR-20 MyClock class can be changed, call-sites
must not be adjusted. Also the purpose of a PSR-20 Clock is to never
call `new DateTimeImmutable()` or `time()` anymore, so the assumption there
are `new DateTimeImmutable()` calls that can be adapted is incorrect.

An adapter does never need to implement both interfaces. In essence an adapter only needs to implement "the other" interface. A ClockAdapter uses a ClockInterface to create an Instant whereas a ClockInterfaceAdapter uses a Clock to create a DateTime. 2 classes that seem rather straight forward.

Indeed. Here's an example implementation for both directions. The `NativeToPsr20` adapter truncates to microseconds and needs to “invent” a timezone. The opinionated choices made there should be correct for the vast majority of users:

    final readonly class Psr20ToNative implements \Time\Clock
    {
        public function __construct(
            private \Psr\Clock\ClockInterface $clock,
        ) {}

        public function now(): \Time\Instant
        {
            return $this->clock->now()->toInstant();
        }
    }

final readonly class NativeToPsr20 implements \Psr\Clock\ClockInterface
    {
        public function __construct(
            private \Time\Clock $clock,
            private \DateTimeZone $timezone = new \DateTimeZone('UTC'),
        ) {}

        public function now(): \DateTimeImmutable
        {
            $now = $this->clock->now();

return \DateTimeImmutable::createFromTimestamp($now->getUnixTimestamp())
                ->setMicrosecond(\intdiv($now->getNanoseconds(), 1_000))
                ->setTimezone($this->timezone);
        }
    }

Best regards
Tim Düsterhus

Reply via email to