This builds on [felix dot edelmann at check24 dot de]'s note about Daylight Saving Time (DST) transitions.
TLDR: it seems that **using the time component of an ISO duration** string is what switches-on time-zone awareness. At least in this case, "*duration* string" may understate its meaning/effect.
Expand on Felix's code a little and a pattern starts to emerge:
<?php
$timeZone = new DateTimeZone('Europe/Berlin');
$beforeChangeover = new DateTimeImmutable('2025-03-29 13:00:00', $timeZone);
print_r($beforeChangeover->add(new DateInterval('P1D'))); print_r($beforeChangeover->add(new DateInterval('PT1440M'))); print_r($beforeChangeover->add(new DateInterval('PT24H'))); print_r($beforeChangeover->add(DateInterval::createFromDateString('1 day'))); print_r($beforeChangeover->add(DateInterval::createFromDateString('1440 minute'))); print_r($beforeChangeover->add(DateInterval::createFromDateString('24 hour'))); print_r($beforeChangeover->modify('+1 day')); print_r($beforeChangeover->modify('+1440 minute')); print_r($beforeChangeover->modify('+24 hour')); print_r(new DateTimeImmutable('2025-03-30 13:00:00', $timeZone)->diff($beforeChangeover)); print_r(new DateTimeImmutable('2025-03-30 14:00:00', $timeZone)->diff($beforeChangeover)); ?>