note 125668 added to datetime.add

From: Date: Sat, 09 Jan 2021 22:57:06 +0000
Subject: note 125668 added to datetime.add
Groups: php.notes 
Request: Send a blank email to php-notes+get-216077@lists.php.net to get a copy of this message
Remark, that calculations on date are not defined as bijective operations. The Summertime is integrated by mixing two concepts. You should test it beforehead. Datetime will correct a date after each summation, if a date (29.2.2021 => 1.3.2021) or a datetime (29.3.2020 2:30 am (Europe/Berlin) => 29.3.2020 3:30 or 29.3.2020 1:30) Example <?php $expectEaster = date_create_from_format('Y-m-d H:i:s', '2020-04-12 12:00:00', new DateTimeZone('Europe/Berlin')); $interval = new DateInterval('PT20761M'); $expectEaster->sub($interval); echo('recalc '.$expectEaster->format('Y-m-d H:i:s')."\n"); $expectEaster->add($interval); echo('easter '.$expectEaster->format('Y-m-d H:i:s')."\n" ); $expectEaster = date_create_from_format('Y-m-d H:i:s', '2020-04-12 12:00:00', new DateTimeZone('Europe/Berlin')); $interval = new DateInterval('PT20760M'); $expectEaster->sub($interval); echo('recalc '.$expectEaster->format('Y-m-d H:i:s')."\n"); $expectEaster->add($interval); echo('easter '.$expectEaster->format('Y-m-d H:i:s')."\n"); $expectEaster = date_create_from_format('Y-m-d H:i:s', '2020-04-12 12:00:00', new DateTimeZone('Europe/Berlin')); $interval = new DateInterval('PT20701M'); $expectEaster->sub($interval); echo('recalc '.$expectEaster->format('Y-m-d H:i:s')."\n"); $expectEaster->add($interval); echo('easter '.$expectEaster->format('Y-m-d H:i:s')."\n"); $expectEaster = date_create_from_format('Y-m-d H:i:s', '2020-04-12 12:00:00', new DateTimeZone('Europe/Berlin')); $interval = new DateInterval('PT20700M'); $expectEaster->sub($interval); echo('recalc '.$expectEaster->format('Y-m-d H:i:s')."\n"); $expectEaster->add($interval); echo('easter '.$expectEaster->format('Y-m-d H:i:s')."\n"); // Result // recalc 2020-03-29 00:59:00 // reduce the missing hour before you calcuclate the datetime // easter 2020-04-12 11:00:00 // recalcultate the date and remove the missing hour // recalc 2020-03-29 03:00:00 //because 2020-03-29 3:00:00 [it means 2020-03-29 2:00:00] does not exist add 60 min) // easter 2020-04-12 13:00:00 // recalc 2020-03-29 03:59:00 // -(12*60+(11+2)*1440+21*60) = -(20701 min) = = 29.3.2020 2:59(not exist => no-equivalent add of one hour) => 29.3.2020 3:59 // easter 2020-04-12 13:00:00 // Recalc add 60 minutes, because the hour does not exist.) // recalc 2020-03-29 03:00:00 // -(12*60+(11+2)*1440+21*60 min)= -(20700 min) = 29.3.2020 3:00 // easter 2020-04-12 12:00:00 // +(12*60+(11+2)*1440+21*60 min)= +(20700 min) = 29.3.2020 ---- Server IP: 45.112.84.4 Probable Submitter: 195.138.250.34 (proxied: 2003:e4:970d:2c01:9000:be8f:38f4:ae0d) ---- Manual Page -- http://php.net/manual/en/datetime.add.php Edit -- https://master.php.net/note/edit/125668 Del: integrated -- https://master.php.net/note/delete/125668/integrated Del: useless -- https://master.php.net/note/delete/125668/useless Del: bad code -- https://master.php.net/note/delete/125668/bad+code Del: spam -- https://master.php.net/note/delete/125668/spam Del: non-english -- https://master.php.net/note/delete/125668/non-english Del: in docs -- https://master.php.net/note/delete/125668/in+docs Del: other reasons-- https://master.php.net/note/delete/125668 Reject -- https://master.php.net/note/reject/125668 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#216077) next »