php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #39560 Inconsistent behaviour of strtotime when days > days in month
Submitted: 2006-11-20 17:03 UTC Modified: 2006-11-20 17:21 UTC
From: php at colin dot guthr dot ie Assigned:
Status: Not a bug Package: Date/time related
PHP Version: 5.2.0 OS: Linux
Private report: No CVE-ID: None
 [2006-11-20 17:03 UTC] 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.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-11-20 17:21 UTC] derick@php.net
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\".
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun May 05 16:01:30 2024 UTC