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
+Status:             Closed
 Type:               Bug
 Package:            Date/time related
 Operating System:   Win 7
 PHP Version:        5.3.3
 Assigned To:        derick
 Block user comment: N

 New Comment:

This bug has been fixed in SVN.

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.




Previous Comments:
------------------------------------------------------------------------
[2010-08-30 18:40:31] [email protected]

Automatic comment from SVN on behalf of derick
Revision: http://svn.php.net/viewvc/?view=revision&revision=302891
Log: - Fixed bug #52430 (date_parse parse 24:xx:xx as valid time).
(Derick)

------------------------------------------------------------------------
[2010-07-26 11:54:41] [email protected]

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"

  }

------------------------------------------------------------------------
[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

Reply via email to