#20382 [Fbk]: strtotime ("Monday", $date) can produce incorrect output

From: Date: Thu, 08 Apr 2004 11:00:18 +0000
Subject: #20382 [Fbk]: strtotime ("Monday", $date) can produce incorrect output
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-57771@lists.php.net to get a copy of this message
 ID:               20382
 Updated by:       derick@php.net
 Reported By:      nickj-phpbugs at nickj dot org
 Status:           Feedback
 Bug Type:         Date/time related
 Operating System: *
 PHP Version:      4CVS, 5CVS
 New Comment:

I'm pretty sure the script is buggy. Please give us a test case for ONE
date that is wrong, and comment your code properly too.


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

[2004-04-08 04:25:55] sniper@php.net

Can you please give a simpler test? (I somehow have a feeling your
script is buggy, not PHP) 


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

[2004-04-08 01:39:23] nickj-phpbugs at nickj dot org

It appears that this problem has not been resolved.

I've downloaded the latest Stable Win32 package snapshot from
http://snaps.php.net/ , in particular this one:
http://snaps.php.net/win32/php4-win32-STABLE-200404080430.zip
[I.e.
from roughly 5 after this bug was closed]

Then I've run the test script on it from an above comment. 

This produces the following results:

==========================================================
I:\new downloads\just downloaded\php4-win32-STABLE-200404080430>php
bug-20382-test.php
Content-type: text/html
X-Powered-By: PHP/4.3.6RC3-dev

Discrepancy for 2002-3-26 - results were 2002-3-31 vs 2002-4-1
Discrepancy for 2002-3-27 - results were 2002-3-31 vs 2002-4-1
Discrepancy for 2002-3-28 - results were 2002-3-31 vs 2002-4-1
Discrepancy for 2002-3-29 - results were 2002-3-31 vs 2002-4-1
Discrepancy for 2002-3-30 - results were 2002-3-31 vs 2002-4-1
Discrepancy for 2002-3-31 - results were 2002-3-31 vs 2002-4-1
Discrepancy for 2003-3-25 - results were 2003-3-30 vs 2003-3-31
Discrepancy for 2003-3-26 - results were 2003-3-30 vs 2003-3-31
Discrepancy for 2003-3-27 - results were 2003-3-30 vs 2003-3-31
Discrepancy for 2003-3-28 - results were 2003-3-30 vs 2003-3-31
Discrepancy for 2003-3-29 - results were 2003-3-30 vs 2003-3-31
Discrepancy for 2003-3-30 - results were 2003-3-30 vs 2003-3-31
Discrepancy for 2004-3-23 - results were 2004-3-28 vs 2004-3-29
Discrepancy for 2004-3-24 - results were 2004-3-28 vs 2004-3-29
Discrepancy for 2004-3-25 - results were 2004-3-28 vs 2004-3-29
Discrepancy for 2004-3-26 - results were 2004-3-28 vs 2004-3-29
Discrepancy for 2004-3-27 - results were 2004-3-28 vs 2004-3-29
Discrepancy for 2004-3-28 - results were 2004-3-28 vs 2004-3-29
Discrepancy for 2005-3-22 - results were 2005-3-27 vs 2005-3-28
Discrepancy for 2005-3-23 - results were 2005-3-27 vs 2005-3-28
Discrepancy for 2005-3-24 - results were 2005-3-27 vs 2005-3-28
Discrepancy for 2005-3-25 - results were 2005-3-27 vs 2005-3-28
Discrepancy for 2005-3-26 - results were 2005-3-27 vs 2005-3-28
Discrepancy for 2005-3-27 - results were 2005-3-27 vs 2005-3-28
Discrepancy for 2006-3-21 - results were 2006-3-26 vs 2006-3-27
Discrepancy for 2006-3-22 - results were 2006-3-26 vs 2006-3-27
Discrepancy for 2006-3-23 - results were 2006-3-26 vs 2006-3-27
Discrepancy for 2006-3-24 - results were 2006-3-26 vs 2006-3-27
Discrepancy for 2006-3-25 - results were 2006-3-26 vs 2006-3-27
Discrepancy for 2006-3-26 - results were 2006-3-26 vs 2006-3-27
Discrepancy for 2007-3-20 - results were 2007-3-25 vs 2007-3-26
Discrepancy for 2007-3-21 - results were 2007-3-25 vs 2007-3-26
Discrepancy for 2007-3-22 - results were 2007-3-25 vs 2007-3-26
Discrepancy for 2007-3-23 - results were 2007-3-25 vs 2007-3-26
Discrepancy for 2007-3-24 - results were 2007-3-25 vs 2007-3-26
Discrepancy for 2007-3-25 - results were 2007-3-25 vs 2007-3-26
PHP version: 4.3.6RC3-dev<br>
==========================================================

What I would expect to happen is that there would not be any
discrepancies. The fact there are discrepancies indicates to me that
this problem is still unresolved.

I understand that there have been two date-related problems solved
recently (#27719 and #27780), but whatever updates were made for those
problems do not appear to have fixed this problem.

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

[2004-04-03 09:10:33] derick@php.net

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.



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

[2003-04-06 18:47:03] scottmacvicar at ntlworld dot com

This is a DST problem by the looks of it. The specific dates mentioned
are when DST takes effect which is the last sunday in March.

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

[2002-11-12 19:46:28] nickj-phpbugs at nickj dot org

OK, I decided that was needed was some kind of automated testing, so I
wrote it:
============================================
#!/root/php4-200211122230 -q
<?php

// report any errors at all
error_reporting (E_ALL);

// pass a date, supply a strtotime modifier, and get a date back
function getDateWithModifier($date, $modifier) {
	list ($year, $month, $day) = explode ("-",$date);
	$starting_timestamp = mktime (1,1,1,$month,$day,$year);
	$timestamp_with_modifier = strtotime ($modifier,
$starting_timestamp);
	return date("Y-n-j", $timestamp_with_modifier);
}

/*
** @desc: for the specified date, will find the date for the desired
day of the 
**        week that is also in the same week. Does NOT use 'strtotime'
*/
function getDayOfTheWeekFromDate($date, $desired_day_of_week) {
	// weekdays - note special case for sundays (7, not 0), so as to treat
as end of week, not start
    $weekdays = array ("Sunday" => 7, "Monday" => 1, "Tuesday"
=> 2,
"Wednesday" => 3,
                            "Thursday" => 4, "Friday" => 5,
"Saturday"
=> 6);

    // convert into a number
    $desired_day_of_week_number = $weekdays[$desired_day_of_week];

    // see what day we have currently
    list ($year, $month, $day) = explode ("-",$date);
    $date_day_of_week = date("w", mktime
(17,17,17,$month,$day,$year));

	$new_day = $day+(($desired_day_of_week_number-$date_day_of_week)+7) %
7;
    return date("Y-n-j", mktime (17,17,17,$month,$new_day,$year));
}


// run an automated test to compare the output of these two functions,
and complain if they differ
for ($i=1; $i<1000; $i++) {
	$date =  date("Y-n-j", mktime (17,17,17,1,$i,1999));
	$strtotime_date = getDateWithModifier($date, "Monday");
	$other_date = getDayOfTheWeekFromDate($date, "Monday");
	if ($strtotime_date != $other_date) {
		print "Discrepancy for $date - results were $strtotime_date vs
$other_date\n";
	}
}

print "PHP version: " . phpversion(). "<br>\n";

?>
============================================


Here's the output that I get:
============================================
[root@www tmp]# ./automated-date-test.php 
Discrepancy for 1999-3-23 - results were 1999-3-28 vs 1999-3-29
Discrepancy for 1999-3-24 - results were 1999-3-28 vs 1999-3-29
Discrepancy for 1999-3-25 - results were 1999-3-28 vs 1999-3-29
Discrepancy for 1999-3-26 - results were 1999-3-28 vs 1999-3-29
Discrepancy for 1999-3-27 - results were 1999-3-28 vs 1999-3-29
Discrepancy for 1999-3-28 - results were 1999-3-28 vs 1999-3-29
Discrepancy for 2000-3-21 - results were 2000-3-26 vs 2000-3-27
Discrepancy for 2000-3-22 - results were 2000-3-26 vs 2000-3-27
Discrepancy for 2000-3-23 - results were 2000-3-26 vs 2000-3-27
Discrepancy for 2000-3-24 - results were 2000-3-26 vs 2000-3-27
Discrepancy for 2000-3-25 - results were 2000-3-26 vs 2000-3-27
Discrepancy for 2000-3-26 - results were 2000-3-26 vs 2000-3-27
Discrepancy for 2001-3-20 - results were 2001-3-25 vs 2001-3-26
Discrepancy for 2001-3-21 - results were 2001-3-25 vs 2001-3-26
Discrepancy for 2001-3-22 - results were 2001-3-25 vs 2001-3-26
Discrepancy for 2001-3-23 - results were 2001-3-25 vs 2001-3-26
Discrepancy for 2001-3-24 - results were 2001-3-25 vs 2001-3-26
Discrepancy for 2001-3-25 - results were 2001-3-25 vs 2001-3-26
PHP version: 4.3.0-dev<br>
[root@www tmp]# 
============================================

In other words, the result for these 6 days of the year consistently
appears to be wrong. (I suppose I should be glad that the very first
date I choose to test this function with just by fluke happened to be
one of those 6 days, as opposed to causing mysterious problems later!)


Does anyone else get any results that appear incorrect on running this
script?

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

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/20382

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


Thread (32 messages)

« previous php.bugs (#57771) next »