#43452 [Asn->Csd]: strtotime returns wrong date when requested day is same as first day of the mon

From: Date: Wed, 23 Jul 2008 18:50:15 +0000
Subject: #43452 [Asn->Csd]: strtotime returns wrong date when requested day is same as first day of the mon
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-127210@lists.php.net to get a copy of this message
 ID:               43452
 Updated by:       derick@php.net
 Reported By:      sean dot thorne at gmail dot com
-Status:           Assigned
+Status:           Closed
 Bug Type:         Date/time related
 Operating System: Mac OS X 10.4.11
 PHP Version:      5.2CVS-2007-11-29 (CVS)
 Assigned To:      derick
 New Comment:

This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.




Previous Comments:
------------------------------------------------------------------------

[2008-07-17 10:32:00] derick@php.net

Yeah, and I've done some work on that -- but it's not ready yet.

------------------------------------------------------------------------

[2008-07-17 10:29:15] m dot ford at leedsmet dot ac dot uk

Then there's a doc problem, because currently http://php.net/strtotime
describes its first argument as "The string to parse, according to the
GNU » Date Input Formats syntax", with a link to the GNU documentation. 
If strtotime() does not, in fact, implement the entirety of what's
described there, exactly as described, then what's actually implemented
should be incorporated into the PHP manual and that link removed.

------------------------------------------------------------------------

[2008-07-15 17:23:37] derick@php.net

Assigning this to myself, but be aware that we do not necessarily
implement this GNU date stuff -- we've never done this either. I'll
check it though.

------------------------------------------------------------------------

[2008-07-15 17:19:38] m dot ford at leedsmet dot ac dot uk

Derick, please take another look at this.

I've examined it in some depth, and tend to agree there's a bug here. 
However, if you read the GNU Date Input Formats syntax, linked from
http://php.net/manual/function.strtotime.php,
very closely, you find it
says:

"a day of the week will forward the date (only if necessary) to reach
that day of the week in the future"

... and ...

"a number may precede a day of the week item to move forward
supplementary weeks."

The crucial word here is "supplementary". Taken together, these
specifications suggest that, somewhat counter-intuitively:

   Monday month year

should represent the first Monday of the month, no matter what date it
falls on, and

   1 Monday month year

should be the Monday *after* that (i.e. the 2nd Monday!!), and so on.
Other wording in the GNU Date "Day of week items" section would tend to
confirm this interpretation.

I therefore submit that the bug actually manifests when the first
occurrence of the requested weekday falls on any date *other* than the
first of the month! :(

However you interpret it, it's nonetheless clear that the relationship
of "1 weekday" to "weekday" should be fixed -- either according to the
GNU specification to occur 1 week later, or more intuitively to mean the
same thing. It's definitely NOT right that "1 Monday" (for example)
means something different from "Monday" *only* when "Monday" is the 1st
of the month...!!

------------------------------------------------------------------------

[2008-06-17 17:21:57] soapergem at gmail dot com

I also confirmed this. This is pretty serious, too! There are an
infinite number of examples in which you can reproduce it; here are a
few:


  //  expect 06-15-2008, get 06-22-2008
  $date = strtotime('3 Sunday June 2008');
  echo date('m-d-Y', $date);
  
  //  expect 07-08-2008, get 07-15-2008
  $date = strtotime('2 Tuesday July 2008');
  echo date('m-d-Y', $date);
  
  //  expect 08-22-2008, get 08-29-2008
  $date = strtotime('4 Friday August 2008');
  echo date('m-d-Y', $date);
  
  //  expect 09-29-2008, get 10-06-2008
  $date = strtotime('5 Monday September 2008');
  echo date('m-d-Y', $date);
  
  //  expect 10-01-2008, get 10-08-2008
  $date = strtotime('1 Wednesday October 2008');
  echo date('m-d-Y', $date);


Developers please take note: THIS IS A SERIOUS BUG! (and it's been
around for a long time)

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/43452

-- 
Edit this bug report at http://bugs.php.net/?id=43452&edit=1



Thread (18 messages)

« previous php.bugs (#127210) next »