note 130189 added to datetime.sub

From: Date: Thu, 27 Mar 2025 13:56:52 +0000
Subject: note 130189 added to datetime.sub
Groups: php.notes 
Request: Send a blank email to php-notes+get-222023@lists.php.net to get a copy of this message
Be careful when subtracting a duration crossing a DST change, it can output a resulting date AFTER your base date. // tested in 8.3.18, 7.4.33 // DST timezone shift is applied properly when setting time explicitely echo (new DateTime('2025-03-30'))->setTimeZone(new DateTimeZone('Europe/Paris'))->setTime(1,59,0)->format('c').PHP_EOL; echo (new DateTime('2025-03-30'))->setTimeZone(new DateTimeZone('Europe/Paris'))->setTime(2,0,0)->format('c').PHP_EOL; echo (new DateTime('2025-03-30'))->setTimeZone(new DateTimeZone('Europe/Paris'))->setTime(2,1,0)->format('c').PHP_EOL; // 2025-03-30T01:59:00+01:00 < correct // 2025-03-30T03:00:00+02:00 < correct // 2025-03-30T03:01:00+02:00 < correct echo PHP_EOL; // DST timezone shift is applied properly when addind a duration $startDateTime = (new DateTime('2025-03-30'))->setTimeZone(new DateTimeZone('Europe/Paris'))->setTime(1,58,0); echo $startDateTime->format('c').PHP_EOL; $endDatetime = clone($startDateTime)->add(DateInterval::createFromDateString('4 minutes')); echo $endDatetime->format('c').PHP_EOL; // 2025-03-30T01:58:00+01:00 < correct // 2025-03-30T03:02:00+02:00 < correct echo PHP_EOL; // DST timezone shift is applied improperly when subtracting a duration $startDateTime = (new DateTime('2025-03-30'))->setTimeZone(new DateTimeZone('Europe/Paris'))->setTime(3,2,0); echo $startDateTime->format('c').PHP_EOL; $endDatetime = clone($startDateTime)->sub(DateInterval::createFromDateString('4 minutes')); echo $endDatetime->format('c').PHP_EOL; // 2025-03-30T03:02:00+02:00 < correct // 2025-03-30T03:58:00+02:00 < incorrect !!! echo PHP_EOL; // DST timezone shift is still applied improperly when adding a negative duration $startDateTime = (new DateTime('2025-03-30'))->setTimeZone(new DateTimeZone('Europe/Paris'))->setTime(3,2,0); echo $startDateTime->format('c').PHP_EOL; $endDatetime = clone($startDateTime)->add(DateInterval::createFromDateString('-4 minutes')); echo $endDatetime->format('c').PHP_EOL; // 2025-03-30T03:02:00+02:00 < correct // 2025-03-30T03:58:00+02:00 < incorrect !!! ---- Server IP: 45.112.84.4 Probable Submitter: 80.90.5.137 (proxied: 194.177.53.153) ---- Manual Page -- https://php.net/manual/en/datetime.sub.php Edit -- https://main.php.net/note/edit/130189 Del: integrated -- https://main.php.net/note/delete/130189/integrated Del: useless -- https://main.php.net/note/delete/130189/useless Del: bad code -- https://main.php.net/note/delete/130189/bad+code Del: spam -- https://main.php.net/note/delete/130189/spam Del: non-english -- https://main.php.net/note/delete/130189/non-english Del: in docs -- https://main.php.net/note/delete/130189/in+docs Del: other reasons-- https://main.php.net/note/delete/130189 Reject -- https://main.php.net/note/reject/130189 Search -- https://main.php.net/manage/user-notes.php

« previous php.notes (#222023) next »