Invalid date/time handling - strtotime()

From: Date: Tue, 08 Sep 2015 04:54:36 +0000
Subject: Invalid date/time handling - strtotime()
Groups: php.internals 
Request: Send a blank email to internals+get-88114@lists.php.net to get a copy of this message
Hi Derick and all, strtotime() may be improved. $ php -r "echo date('Y-m-d',strtotime('00-00-00 00:00:00'));" 1999-11-30 because 00 is 2000, 00 month is -1(=12) and 00 date is -1(last date of previous month). This is unintuitive result at a glance. strtotime() handles date/time edge cases and produces reasonable timestamp in some cases. $ php -r "echo date('Y-m-d H:i:s',strtotime('00-01-01 24:00:00'));" 2000-01-02 00:00:00 $ php -r "echo date('Y-m-d H:i:s',strtotime('03-02-29 00:00:00'));" 2003-03-01 00:00:00 $ php -r "echo date('Y-m-d H:i:s',strtotime('03-02-28 23:59:60'));" 2003-03-01 00:00:00 It returns FALSE for larger values exceeds edge cases. For example, $ php -r "var_dump(strtotime('03-02-32 00:00:00'));" bool(false) Somehow it does not accept 13 month while it is edge case. $ php -r "var_dump(strtotime('03-13-30 00:00:00'));" bool(false) It does not accept day 32 while it accepts 2/31. $ php -r "var_dump(strtotime('03-01-32 00:00:00'));" bool(false) $ php -r "var_dump(strtotime('03-02-31 00:00:00'));" int(1046617200) 25 hour/60 minutes is invalid also. $ php -r "var_dump(strtotime('03-02-31 00:60:00'));" bool(false) $ php -r "var_dump(strtotime('03-02-31 25:00:00'));" bool(false) It seems edge case handling is inconsistent. How about make strtotime() - Accept all edge cases by default. - Add $strict flag as 2nd parameter and reject any invalid date/time. (Do not allow leap second also? Some system may create 60th second) Alternatively, we may be strict - Disallow all edge cases by default. (There may be problem with leap second) Any comments? Reference: https://bugs.php.net/bug.php?id=45647 -- Yasuo Ohgaki yohgaki@ohgaki.net

« previous php.internals (#88114) next »