Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:88152 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 13905 invoked from network); 11 Sep 2015 08:51:25 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 11 Sep 2015 08:51:25 -0000 Authentication-Results: pb1.pair.com header.from=derick@php.net; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=derick@php.net; spf=unknown; sender-id=unknown Received-SPF: unknown (pb1.pair.com: domain php.net does not designate 82.113.146.227 as permitted sender) X-PHP-List-Original-Sender: derick@php.net X-Host-Fingerprint: 82.113.146.227 xdebug.org Linux 2.6 Received: from [82.113.146.227] ([82.113.146.227:49731] helo=xdebug.org) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id BC/41-26634-A0692F55 for ; Fri, 11 Sep 2015 04:51:22 -0400 Received: from localhost (localhost [IPv6:::1]) by xdebug.org (Postfix) with ESMTPS id 9A71010C168; Fri, 11 Sep 2015 09:51:18 +0100 (BST) Date: Fri, 11 Sep 2015 09:51:18 +0100 (BST) X-X-Sender: derick@whisky.home.derickrethans.nl To: Yasuo Ohgaki cc: "internals@lists.php.net" In-Reply-To: Message-ID: References: User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Subject: Re: Invalid date/time handling - strtotime() From: derick@php.net (Derick Rethans) On Wed, 9 Sep 2015, Yasuo Ohgaki wrote: > Hi Derick, > > On Wed, Sep 9, 2015 at 1:31 AM, Derick Rethans wrote: > > Currently, it works as follows by design: > > > > - the parser, allows for each unit (year, month, day, hour, minute, > > second) the full range of values. For a year that's just 4 digits, for > > a month that's 0-12, day is 0-31 and for hour and minute it's 0-59. > > > > - 60 is allowed for seconds, as sometimes date strings with that > > leapsecond do show up. But PHP implements Unix time where "60" is not > > a valid second number and hence it overflows. There is some more > > background information at http://drck.me/leapsec-6ye > > > > - strtotime() returns false if any number is outside of the ranges, and > > new DateTime() throws an exception. > > > > - the parser is dumb, and doesn't do any checks to make it faster (and > > more generic) > > > > - *but*, there is an additional check if you pass in an invalid date > > (like your suggested $strict): > > > > $ php -r '$res = date_parse("2015-09-31"); var_dump($res["warnings"]);' > > > > array(1) { > > [11] => > > string(27) "The parsed date was invalid" > > } > > > > - It is already possible to handle the edge cases, but then you need to > > supply the right format. Otherwise there are too many possible > > confusing and unintuitive results coming out of the parser: > > > > php -r '$res = date_create_from_format("Y-m-d", "2015-09-34"); var_dump($res);' > > > > class DateTime#1 (3) { > > public $date => > > string(26) "2015-10-04 17:24:43.000000" > > public $timezone_type => > > int(3) > > public $timezone => > > string(13) "Europe/London" > > } > > > > - We can't add a second argument to strtotime(), because it already > > exists. > > > > - Having a "strict" option to strtotime() does also not work, as that > > would mean two distinct parsing routines. > > > > With all those concerns, as well as functionality to handle edge cases > > in place, I do not think we should change anything. > > Thank you for detailed explanation. > I'm OK with current design/API. How about add documentation for more precise > date/time parsing and handling to strtotime() manual page? There is a whole section at: http://docs.php.net/manual/en/datetime.formats.php Although it doesn't seem to get the 60 for seconds right. > I made a bug report to track this. > https://bugs.php.net/bug.php?id=70463 Ok, cool. cheers, Derick