Invalid date/time handling - strtotime()
| From: | Yasuo Ohgaki | 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