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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: php at colin dot guthr dot ie
New email:
PHP Version: OS:

 

 [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

Pull Requests

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-2025 The PHP Group
All rights reserved.
Last updated: Wed Feb 05 09:01:30 2025 UTC