|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2006-11-20 17:21 UTC] derick@php.net
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 14:00:01 2025 UTC |
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.