Edit report at http://bugs.php.net/bug.php?id=52430&edit=1
ID: 52430 Updated by: [email protected] Reported by: pulzarraider at gmail dot com Summary: date_parse parse 24:xx:xx as valid time Status: Verified Type: Bug Package: Date/time related Operating System: Win 7 PHP Version: 5.3.3 Assigned To: derick Block user comment: N New Comment: date_parse (and friends) are not made to validate. It will also happily accept "2010-02-31" as a date. Since PHP 5.3.x, date_parse() however adds a warning if a date is invalid; I should add that for time as well: der...@kossu:/tmp$ php bug52430.php array(12) { ["year"]=> int(2010) ["month"]=> int(2) ["day"]=> int(31) ["hour"]=> int(24) ["minute"]=> int(52) ["second"]=> int(59) ["warning_count"]=> int(1) ["warnings"]=> array(1) { [20]=> string(27) "The parsed date was invalid" } Previous Comments: ------------------------------------------------------------------------ [2010-07-26 08:00:53] [email protected] According to ISO 8601: "As this International Standard is based on the 24-hour timekeeping system that is now in common use, hours are represented by two digits from [00] to [24], minutes are represented by two digits from [00] to [59], and seconds are represented by two digits from [00] to [60]. For most purposes, times will be represented by four digits [hhmm]. The representation of the hour by [24] is only allowed to indicate midnight, see 5.3.2. The representation of the second by [60] is only allowed to indicate the positive leap second or a time-point within that second. ... Midnight will normally be represented as [0000] or [2400]. ... The end of one day [2400] coincides with [0000] at the start of the next day, e.g. 2400 on 1985 April 12 is the same as 0000 on 1985 April 13. If there is no association with a date or a time-interval both a) and b) represent the same clock time in the 24-hour timekeeping system." So 2400 isn't technically wrong but it doesn't look like the regular expressions in parse_date.re are context specific right now (eg. 24 only if followed by 00 so it allows 2401 through 2459). This looks like a pretty big rewrite. Assigning to Derick. ------------------------------------------------------------------------ [2010-07-24 21:20:26] pulzarraider at gmail dot com Description: ------------ In the 24-hour time notation, the day begins at midnight, 00:00, and the last minute of the day begins at 23:59. Date_parse function returns no warning and no error when any time starting with hour "24" is used as parameter. But some error is expected, because 2010-1-1 24:59:59 is NOT valid date. This can cause serious errors in scripts that use date_parse for validating dateTime strings. Test script: --------------- <?php date_parse('2010-1-1 24:00:00'); //This is invalid date, but date_parse returns no error and warning //Expected: error "Unexpected character" //date_parse('2010-1-1 24:59:59'); //This is also invalid date, but date_parse returns no error and warning //Expected: error "Unexpected character" ?> Expected result: ---------------- Array ( [year] => 2010 [month] => 1 [day] => 1 [hour] => 0 [minute] => 0 [second] => 0 [fraction] => 0 [warning_count] => 0 [warnings] => Array ( ) [error_count] => 1 [errors] => Array ([9]=>'Unexpected character') [is_localtime] =>false ) Actual result: -------------- Array ( [year] => 2010 [month] => 1 [day] => 1 [hour] => 24 <===== wrong [minute] => 0 [second] => 0 [fraction] => 0 [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 <===== wrong [errors] => Array ( ) <===== wrong [is_localtime] =>false ) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52430&edit=1
