php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #62193 strtotime returning wrong month
Submitted: 2012-05-31 02:10 UTC Modified: 2013-05-31 23:41 UTC
Votes:3
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: thomasrothwell dot 1990 at gmail dot com Assigned:
Status: Not a bug Package: Date/time related
PHP Version: 5.3Git-2012-05-31 (Git) OS: Ubuntu 12.04 LTS & Ubuntu 10.04
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: thomasrothwell dot 1990 at gmail dot com
New email:
PHP Version: OS:

 

 [2012-05-31 02:10 UTC] thomasrothwell dot 1990 at gmail dot com
Description:
------------
Came across the wrong month being returned when using the following:
<?php echo date('m', strtotime('+1 MONTH')); ?>
Expected: 06
Result: 07

I've only noticed this occur Today (31st of May 2012).

Altered my php.ini to use the following config as well:

date.timezone = "Australia/Sydney"
date.default_latitude = -35.308142
date.default_longitude = 149.124518

Thinking it could be a timezone issue. Also attempted use of gmdate.

What I found to work was:
<?php echo date('m', strtotime('first day of +1 month')); ?>
Expected: 06
Result: 06


Test script:
---------------
<?php
//Expected 06
echo date('m', strtotime('+1 MONTH'));
//Result 07

//Expected 06
echo gmdate('m', strtotime('+1 MONTH'));
//Result 07

//Expected 06
echo date('m', strtotime('first day of +1 month'));
//Result 06

Expected result:
----------------
060606

Actual result:
--------------
070706

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-05-31 02:25 UTC] thomasrothwell dot 1990 at gmail dot com
Assuming the issue is related to June only having 30 days, which then pushes it to the next month July.

<?php
  2 //Expected 30/06
  3 echo date('d/m', strtotime('+1 MONTH'));
  4 //Result 01/07
  5 
  6 //Expected 30/06
  7 echo gmdate('d/m', strtotime('+1 MONTH'));
  8 //Result 01/07
  9 
 10 //Expected 01/06
 11 echo date('d/m', strtotime('first day of +1 month'));
 12 //Result 01/06


Could be safe to assume that the function should check the limits of each month to prevent it from going past the extreme.
 [2012-05-31 02:25 UTC] thomasrothwell dot 1990 at gmail dot com
-Package: date_time +Package: *Data Exchange functions
 [2013-05-31 15:29 UTC] phpbugs at theHiltons dot net
Reproduced May 31st, 2013, CentOS 64Bit, PHP 5.4.15:
foreach (['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 
'Nov', 'Dec'] as $monthName) {
    echo "getdate(strtotime('$monthName'))['month'] = " . 
getdate(strtotime($monthName))['month'] . "\n";
    echo "getdate(strtotime('$monthName'))['mon'] = " . 
getdate(strtotime($monthName))['mon'] . "\n";
}
 [2013-05-31 18:10 UTC] aharvey@php.net
-Status: Open +Status: Not a bug -Package: *Data Exchange functions +Package: Date/time related
 [2013-05-31 18:10 UTC] aharvey@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

PHP date functions will overflow out of bound values: since June 31 doesn't 
exist, it becomes July 1.
 [2013-05-31 19:37 UTC] phpbugs at thehiltons dot net
How this is an overflow issue:

$timeStr =  strtotime('Jun'); // just 'Jun'
$date = getdate($timeStr);

The date represented by $date should be in June, but it's not.
Since I didn't specify a day it shouldn't be an overflow issue.
If the day is assumed/implied by the current day then that should be documented.
I would argue that since it is not specified, the 1st of the month at 0:00:00 is 
the safest assumption.
 [2013-05-31 23:41 UTC] rasmus@php.net
This is standard UNIX behaviour. You need to be explicit as you discovered. Try 
the same thing in a shell script, for example:

$ date
Fri May 31 16:37:45 PDT 2013
$ date --date='+1 month' +'Next month is %B'
Next month is July

SQLite and many other tools you will come across follow this same standard 
behaviour when it comes to data manipulation. It is described by GNU here:

http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-
strings.html#SEC120

There is really no good answer to this one. We can't just assume the 1st of the 
month, because then adding 1 day would be equivalent to adding 1 month on the 
last day of the month. That's a huge amount of data loss. So we follow the 
UNIX/GNU convention.
 [2013-06-05 15:45 UTC] phpbugs at thehiltons dot net
Fair enough. Thank you both for taking the time to respond to this.

I would love to see the docs updated to be more specific about this.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Dec 22 02:01:28 2024 UTC