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