Edit report at https://bugs.php.net/bug.php?id=62476&edit=1
ID: 62476 Comment by: kaido at tradenet dot ee Reported by: kaido at tradenet dot ee Summary: DateTime::createFromFormat z format incorrect wrt 29.02 Status: Open Type: Bug Package: Calendar related Operating System: debian 2.6.32-5-amd64 PHP Version: 5.4.4 Block user comment: N Private report: N New Comment: the bug was introduced in commit 4c9fad8b362a7d2b6a94b4961e4b2dc037b2766d to fix the bug #51994. the problem is that in parse_date.c in timelib_parse_from_format() function, in case of the z-format option, the date is immidiately normalized, but at that point (if year format option happens to come _after_ the z - ie right from it) year is not yet set, and -99999 is used instead, which most probably is not a leap year :) the obvious quick solution is to call timelib_do_normalize() only if year is set already. doing so passes all test, too. even the one for #51994. should the timelib_do_normalize() call be added to year option, too, if date/month are set at that point? also, in timelib_do_normalize() there seems to be 3 checks like: if (time->s != TIMELIB_UNSET) .. shouldn't 2nd and 3rd be "if (time->i != TIMELIB_UNSET)" and "if (time->h != TIMELIB_UNSET)" instead ? (I did not dig deep enough, to be sure, though) Previous Comments: ------------------------------------------------------------------------ [2012-07-05 11:04:10] Sjon at hortensius dot net I can confirm this, this is broken since 5.3.9 http://3v4l.org/1Z4W4 ------------------------------------------------------------------------ [2012-07-04 00:20:58] kaido at tradenet dot ee Description: ------------ When creating DateTime object from string and using z (day of year) format option, the 29.02 of the leap year is missing. works ok in 5.3.5 Test script: --------------- for ($d=55;$d<65;$d++) { $dt = DateTime::createFromFormat ('z.Y', $d.'.2012'); $dd = $dt->format ('d.m.Y'); echo "$d $dd\n"; } 29.02.2012 is clearly missing .. Expected result: ---------------- 55 25.02.2012 56 26.02.2012 57 27.02.2012 58 28.02.2012 59 29.02.2012 60 01.03.2012 61 02.03.2012 62 03.03.2012 63 04.03.2012 64 05.03.2012 Actual result: -------------- 55 25.02.2012 56 26.02.2012 57 27.02.2012 58 28.02.2012 59 01.03.2012 60 02.03.2012 61 03.03.2012 62 04.03.2012 63 05.03.2012 64 06.03.2012 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62476&edit=1