ID: 20382 Comment by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] Status: Feedback Bug Type: Date/time related Operating System: Linux Mandrake 7.2 PHP Version: 4.2.3 New Comment:
Happy to comply. I tried it with the CVS snapshot (php4-200211122230), output was: ============================================================= [root@www tmp]# ./script.php <hr> from 2001-3-17, goto monday: 2001-3-19; should be 2001-3-19.<br> from 2001-3-18, goto monday: 2001-3-19; should be 2001-3-19.<br> from 2001-3-19, goto monday: 2001-3-19; should be 2001-3-19.<br> from 2001-3-20, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-21, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-22, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-23, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-24, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-25, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-26, goto monday: 2001-3-26; should be 2001-3-26.<br> from 2001-3-27, goto monday: 2001-4-2 ; should be 2001-4-2.<br> <hr> PHP version: 4.3.0-dev<br> [root@www tmp]# ============================================================= i.e. same problem. The location of the php command-line executable appears to have changed to 'sapi/cli/php' (in the PHP 4.2.3 build process the executable just ends up in the root of the source directory), so this was what I used, hope this is OK. Here is some more info related to the problem that may or may not be relevant: * This machine and I are located in Sydney, Australia. The machine's timezone as shown in 'timeconfig' is set of "Australia/Sydney", and "Hardware clock set to GMT" is shown turned off. Output of the 'date' command looks like this: "Wed Nov 13 10:40:22 EST 2002". Sydney is (depending on daylight savings) around GMT + 10 hours. * I've found today that there was a daylight savings transition for this timezone in that week. From: http://www.dstc.qut.edu.au/DST/marg/daylight.html - "[Daylight savings] ends at 3am on Sunday 25 March 2001. Clocks should be turned back one hour to read 2am (Australian Eastern Standard Time)." * Since there was a daylight savings transition, I've now tried various parameters to the 'mktime' line, in case the hour/minute/second parameters chosen were causing problems because they were too close to the time transition. I've tried the following parameters, all of which produce the same incorrect result: - mktime (23,23,23,$month,$day,$year); - mktime (15,15,15,$month,$day,$year); - mktime (10,10,10,$month,$day,$year); - mktime (5,5,5,$month,$day,$year); - mktime (1,1,1,$month,$day,$year); Previous Comments: ------------------------------------------------------------------------ [2002-11-12 06:17:41] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php4-latest.tar.gz For Windows: http://snaps.php.net/win32/php4-win32-latest.zip Your script produces the expected dates for me with latest CVS snapshot. Please give try it out. ------------------------------------------------------------------------ [2002-11-12 02:11:16] [EMAIL PROTECTED] Strtotime() appears to produce incorrect output under some circumstances - specifically when wanting the date of a particular day of the week day of the week from a given starting date. For example, using 2001-3-20 as a starting point, we want the date for the next Monday. The correct answer is the 26th, but the result produced is the 25th (a Sunday). The correct result is given sometimes, so this appears to depend on the input. A sample script to illustrate: ======================================================= #!/root/php-4.2.3 -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 (10,10,10,$month,$day,$year); $timestamp_with_modifier = strtotime ($modifier, $starting_timestamp); return date("Y-n-j", $timestamp_with_modifier); } print "<hr>\n"; print "from 2001-3-17, goto monday: " . getDateWithModifier("2001-3-17", "Monday") . "; should be 2001-3-19.<br>\n"; print "from 2001-3-18, goto monday: " . getDateWithModifier("2001-3-18", "Monday") . "; should be 2001-3-19.<br>\n"; print "from 2001-3-19, goto monday: " . getDateWithModifier("2001-3-19", "Monday") . "; should be 2001-3-19.<br>\n"; print "from 2001-3-20, goto monday: " . getDateWithModifier("2001-3-20", "Monday") . "; should be 2001-3-26 ###.<br>\n"; print "from 2001-3-21, goto monday: " . getDateWithModifier("2001-3-21", "Monday") . "; should be 2001-3-26 ###.<br>\n"; print "from 2001-3-22, goto monday: " . getDateWithModifier("2001-3-22", "Monday") . "; should be 2001-3-26 ###.<br>\n"; print "from 2001-3-23, goto monday: " . getDateWithModifier("2001-3-23", "Monday") . "; should be 2001-3-26 ###.<br>\n"; print "from 2001-3-24, goto monday: " . getDateWithModifier("2001-3-24", "Monday") . "; should be 2001-3-26 ###.<br>\n"; print "from 2001-3-25, goto monday: " . getDateWithModifier("2001-3-25", "Monday") . "; should be 2001-3-26 ###.<br>\n"; print "from 2001-3-26, goto monday: " . getDateWithModifier("2001-3-26", "Monday") . "; should be 2001-3-26.<br>\n"; print "from 2001-3-27, goto monday: " . getDateWithModifier("2001-3-27", "Monday") . " ; should be 2001-4-2.<br>\n"; print "<hr>\n"; print "PHP version: " . phpversion(). "<br>\n"; ?> ======================================================= Produces this output: ======================================================= [root@www tmp]# ./script.php <hr> from 2001-3-17, goto monday: 2001-3-19; should be 2001-3-19.<br> from 2001-3-18, goto monday: 2001-3-19; should be 2001-3-19.<br> from 2001-3-19, goto monday: 2001-3-19; should be 2001-3-19.<br> from 2001-3-20, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-21, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-22, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-23, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-24, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-25, goto monday: 2001-3-25; should be 2001-3-26 ###.<br> from 2001-3-26, goto monday: 2001-3-26; should be 2001-3-26.<br> from 2001-3-27, goto monday: 2001-4-2 ; should be 2001-4-2.<br> <hr> PHP version: 4.2.3<br> [root@www tmp]# ======================================================== Expected output: The 6 lines with "###" are expected to produce the indicated output, but do not. Problem was noticed today in PHP 4.06, and then verified as being reproducible in PHP 4.2.3 (same output). PHP 4.2.3 configured with: ./configure --with-mysql --enable-xml --enable-wddx ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=20382&edit=1