#39560 [Opn->Bgs]: Inconsistent behaviour of strtotime when days > days in month
| From: | derick@php.net | 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