note 125670 added to datetime.examples-arithmetic

From: Date: Sun, 10 Jan 2021 08:13:09 +0000
Subject: note 125670 added to datetime.examples-arithmetic
Groups: php.notes 
Request: Send a blank email to php-notes+get-216080@lists.php.net to get a copy of this message
There is a pitfall with the summertime in the timezone Europe/Berlin. Beginning Summer-Timer ======================= The hour between 2020-03-29 02:00:00 and 2020-03-29 03:00:00 is missing in the Timezone 'Europe/Berlin'. Explanation to the code below ---------------------------------- The DateInterval of 20700 minutes point to 2020-03-29 03:00:00. The DateInterval of 20701 minutes points to the not existing '2020-03-29 02:59:00', which is resolved to '2020-03-29 03:59:59' by rounding up. The DateInterval-object of 20761 minutes calculate the existing '2020-03-29 01:59:00'. The hour between 2:00 - 3:00 does not exist in the euopean summertime for the date 2020-03-29. The missing hour will be additionally calculated in the substraction. This explain the result '2020-03-29 00:59:00'. It seems, that the addition of the DateInterval-object does not recalculate the missing hour for some (?) reasons. <?php $test = []; $check = date_create_from_format('Y-m-d H:i:s', '2020-04-12 12:00:00', new DateTimeZone('Europe/Berlin')); for ($i = 0; $i < 30000; $i++) { $expectEaster = clone $check; $interval = new DateInterval('PT' . $i . 'M'); $expectEaster->sub($interval); $dummy = clone $expectEaster; $expectEaster->add($interval); if (!in_array($expectEaster->format('Y-m-d H:i:s'), $test)) { $test[$i] = $expectEaster->format('Y-m-d H:i:s'); echo($i . ' near summertime start ' . $expectEaster->format('Y-m-d H:i:s') . '[' . $dummy->format('Y-m-d H:i:s') . ']' . "\n"); } } // 0 near summertime start 2020-04-12 12:00:00[2020-04-12 12:00:00] // 20701 near summertime start 2020-04-12 13:00:00[2020-03-29 03:59:00] // 20761 near summertime start 2020-04-12 11:00:00[2020-03-29 00:59:00] ?> Ending Summer Timer ==================== The european summertime defines the existence of two hours with the notation 2020-10-25 02:00:00 - 2020-10-25 03:00:00 (a) and 2020-10-25 02:00:00 - 2020-10-25 03:00:00 (b). It seems, that the dateTime-object handles the additional hour on an simple internal way. It seems, that you can't differ between this two hours (a) and (b) with the DateTime-object in a simple way. <?php $check = date_create_from_format('Y-m-d H:i:s', '2020-10-25 06:00:00', new DateTimeZone('Europe/Berlin')); for ($i = 0; $i < 361; $i = $i + 60) { $expectEaster = clone $check; $interval = new DateInterval('PT' . $i . 'M'); $expectEaster->sub($interval); $dummy = clone $expectEaster; $expectEaster->add($interval); $test[$i] = $expectEaster->format('Y-m-d H:i:s'); echo($i . ' near summertime end ' . $expectEaster->format('Y-m-d H:i:s') . '[' . $dummy->format('Y-m-d H:i:s') . ' / ' . $dummy->getTimestamp() . ']' . "\n"); } // 0 near summertime end 2020-10-25 06:00:00[2020-10-25 06:00:00 / 1603602000] // 60 near summertime end 2020-10-25 06:00:00[2020-10-25 05:00:00 / 1603598400] // 120 near summertime end 2020-10-25 06:00:00[2020-10-25 04:00:00 / 1603594800] // 180 near summertime end 2020-10-25 06:00:00[2020-10-25 03:00:00 / 1603591200] // 240 near summertime end 2020-10-25 06:00:00[2020-10-25 02:00:00 / 1603587600] // 300 near summertime end 2020-10-25 06:00:00[2020-10-25 02:00:00 / 1603587600] // 360 near summertime end 2020-10-25 06:00:00[2020-10-25 01:00:00 / 1603580400] } ?> ---- Server IP: 45.112.84.4 Probable Submitter: 195.138.250.34 (proxied: 2003:e4:970d:2c01:410:229a:17dc:f020) ---- Manual Page -- http://php.net/manual/en/datetime.examples-arithmetic.php Edit -- https://master.php.net/note/edit/125670 Del: integrated -- https://master.php.net/note/delete/125670/integrated Del: useless -- https://master.php.net/note/delete/125670/useless Del: bad code -- https://master.php.net/note/delete/125670/bad+code Del: spam -- https://master.php.net/note/delete/125670/spam Del: non-english -- https://master.php.net/note/delete/125670/non-english Del: in docs -- https://master.php.net/note/delete/125670/in+docs Del: other reasons-- https://master.php.net/note/delete/125670 Reject -- https://master.php.net/note/reject/125670 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#216080) next »