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
[email protected]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php