#39560 [Opn->Bgs]: Inconsistent behaviour of strtotime when days > days in month

From: Date: Mon, 20 Nov 2006 17:21:38 +0000
Subject: #39560 [Opn->Bgs]: Inconsistent behaviour of strtotime when days > days in month
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-105208@lists.php.net to get a copy of this message
ID: 39560 Updated by: derick@php.net Reported By: php at colin dot guthr dot ie -Status: Open +Status: Bogus Bug Type: Date/time related Operating System: Linux PHP Version: 5.2.0 New Comment: Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php The parser rejects day numbers that can never exist (such as the 32rd). However, in case you use a day number that is legal (01-31) it is used correctly and the month will "overflow". Previous Comments: ------------------------------------------------------------------------ [2006-11-20 17:03:48] php at colin dot guthr dot ie Description: ------------ If you give a date to strtotime that is beyond the end of a given month it sometimes calculates the date correctly (IMO) as the first day of the next month, but this does not happen in months with 31 days. e.g. strtotime('2006-11-31') will correctly create a date of 2006-12-01, but strtotime('2006-11-32') will not create a date of 2007-01-01 as expected. This is the case for all months that have 30 days (and I presume february too). Putting in 31 as the number will overflow to the next month, but putting in 32 in any month will not overflow to the 1st or 2nd day of the next month as appropriate (usual exceptions for February apply!) See example code below for examples. Reproduce code: --------------- <table><tr><th>Date</th><th>Expected Result</th><th>Actual Result</th><th>Pass/Fail?</th></tr><?php $arr_dates = array('2006-11-30 + 1 day' => '2006-12-01', '2006-11-30 + 2 days' => '2006-12-02', '2006-12-31 + 1 day' => '2007-01-01', '2006-06-31' => '2006-07-01', '2006-07-32' => '2006-08-01', '2006-11-31' => '2006-12-01', '2006-11-32' => '2006-12-02', '2006-12-32' => '2007-01-01'); foreach ($arr_dates as $source => $expected) { $result = date('Y-m-d', strtotime($source)); echo '<tr class="'.($result == $expected ? 'pass' : 'fail').'">'; echo '<td>'.$source.'</td>'; echo '<td>'.$expected.'</td>'; echo '<td>'.$result.'</td>'; echo '<td>'.($result == $expected ? 'Pass' : 'Fail').'</td>'; echo '</tr>'; } ?> </table> Expected result: ---------------- Results are contained above if you run it. Actual result: -------------- Actual results are contained above if you run it. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=39560&edit=1

« previous php.bugs (#105208) next »