note 125669 added to datetime.sub

From: Date: Sat, 09 Jan 2021 22:58:00 +0000
Subject: note 125669 added to datetime.sub
Groups: php.notes 
Request: Send a blank email to php-notes+get-216078@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.sub.php Edit -- https://master.php.net/note/edit/125669 Del: integrated -- https://master.php.net/note/delete/125669/integrated Del: useless -- https://master.php.net/note/delete/125669/useless Del: bad code -- https://master.php.net/note/delete/125669/bad+code Del: spam -- https://master.php.net/note/delete/125669/spam Del: non-english -- https://master.php.net/note/delete/125669/non-english Del: in docs -- https://master.php.net/note/delete/125669/in+docs Del: other reasons-- https://master.php.net/note/delete/125669 Reject -- https://master.php.net/note/reject/125669 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#216078) next »