Bug #76848 [Opn->Fbk]: Possible to create Datetime from wrong month day

From: Date: Wed, 21 Nov 2018 12:43:29 +0000
Subject: Bug #76848 [Opn->Fbk]: Possible to create Datetime from wrong month day
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-218074@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=76848&edit=1 ID: 76848 Updated by: cmb@php.net Reported by: wojciech dot mocek at gmail dot com Summary: Possible to create Datetime from wrong month day -Status: Open +Status: Feedback Type: Bug Package: Date/time related Operating System: Linux PHP Version: 7.1.21 -Assigned To: +Assigned To: cmb Block user comment: N Private report: N New Comment: And how should the following be handled? new DateTime('2018-01-31 +1 month') Previous Comments: ------------------------------------------------------------------------ [2018-11-21 11:06:29] wojciech dot mocek at gmail dot com Open. ------------------------------------------------------------------------ [2018-09-11 11:44:56] wojciech dot mocek at gmai dot com You wrote: 1. "That's right, it does not validate the date." Well, hmm, I just run script: $ php <<< "<?php var_dump(new \Datetime('2018-09-32'), new \Datetime('2018-02-32'));" PHP Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (2018-09-32) at position 9 (2): Unexpected character in Standard input code:1 Stack trace: #0 Standard input code(1): DateTime->__construct('2018-09-32') #1 {main} thrown in Standard input code on line 1 So it looks that is validates given input somehow. 2. "It tries its best to come up with the most reasonable interpretation of the string passed to it. Just like how strtotime does.". Come on, please ask people around to do something on "2018-02-31", I think noone will think to do it on "2018-03-03" My question #2 is: do you say that if tell me "Send this mail on 2018-02-31" it is MOST REASONABLE to interpret this as "send it on 2018-03-03" ?! 3. "It tries its best to come up with the most reasonable interpretation of the string passed to it. Just like how strtotime does." . You mentioned about strtotime: $ php <<< "<?php var_dump(strtotime('2018-02-31'));" int(1520035200) $ php <<< "<?php var_dump(strtotime('2018-02-32'));" bool(false) $ php <<< "<?php var_dump(new \Datetime('2018-02-32'));" PHP Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (2018-02-32) at position 9 (2): Unexpected character in Standard input code:1 Stack trace: #0 Standard input code(1): DateTime->__construct('2018-02-32') #1 {main} thrown in Standard input code on line 1 - 31 of February - there is no such date ever in calendar, but PHP creates time. - 32 of February - also there is no such date ever in calendar, PHP forbids to create time "It tries its best to come up with the most reasonable interpretation of the string passed to it" - if it is possible to create time from "never existing 31 of February", so why it is not possible to create time from also "never existing 32 of February" ? 3. In normal life we cannot do anything on 31 of February, nor 31 of September. If you write business application for invoicing, banks, anything, you must validate the date. And if someone writes 31 of February to for example pay tax or send cash, it is mistake and NOT REASONABLE to process. So "day of month" validation should be implemented. Otherwise all business applications will have to use some custom PHP date library, only because native PHP allows to create such nonsense like date from '2018-02-31'. ------------------------------------------------------------------------ [2018-09-08 03:10:55] requinix@php.net That's right, it does not validate the date. It tries its best to come up with the most reasonable interpretation of the string passed to it. Just like how strtotime does. ------------------------------------------------------------------------ [2018-09-07 11:17:36] wojciech dot mocek at gmail dot com Description: ------------ Problem: Possible to create Datetime from wrong month day. Example: 1. new \Datetime('2018-09-31') => gives 2018-10-01 2. new \Datetime('2018-02-31') => gives 2018-03-03 and it applies to all months having less than 31 days. There is no such date like 31 of September or 31 of February, or 31 of November, and so on, while PHP library parses such invalid date string and creates Datetime object. Test script: --------------- $ php <<< "<?php var_dump(new \Datetime('2018-09-31'), new \Datetime('2018-02-31'));" -:1: class DateTime#1 (3) { public $date => string(26) "2018-10-01 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(13) "Europe/Berlin" } -:1: class DateTime#2 (3) { public $date => string(26) "2018-03-03 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(13) "Europe/Berlin" } Expected result: ---------------- Expected behaviour: It should not be possible to create \Datetime object using invalid day of month. $ php <<< "<?php var_dump(new \Datetime('2018-09-31'));" PHP Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (2018-09-31) at position 9 (2): Unexpected character in -:1 Stack trace: #0 -(1): DateTime->__construct('2018-09-31') #1 {main} thrown in - on line 1 Actual result: -------------- $ php <<< "<?php var_dump(new \Datetime('2018-09-31'), new \Datetime('2018-02-31'));" -:1: class DateTime#1 (3) { public $date => string(26) "2018-10-01 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(13) "Europe/Berlin" } -:1: class DateTime#2 (3) { public $date => string(26) "2018-03-03 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(13) "Europe/Berlin" } ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=76848&edit=1

« previous php.bugs (#218074) next »