Как предотвратить PHP для преобразования объекта DateTime с значением 0000-00-00 в значение -0001-11-30

В настоящее время я работаю с Doctrine 2 и MySQL. Я сталкиваюсь с некоторыми проблемами, когда я работаю с полями datetime в mysql, соответственно DateTime в PHP. Когда в моей базе данных значение даты «0000-00-00», в PHP это значение преобразуется в -0001-11-30. Я очень доволен этим, поэтому мне нужно сделать чек на значение «0000-00-00». Есть ли у кого-нибудь идеи по этому поводу? Благодарю.

NB Я думаю, что правильно сделать проверку на «-0001-11-30» вместо «0000-00-00».

Если дата не установлена, используйте NULL для указания этого состояния. Это решает вашу проблему и делает схему базы данных более понятной и многословной.

Альтернативой является установка режима NO_ZERO_DATE SQL на вашем сервере MySQL. Вы можете установить его для своего текущего сеанса, как описано в http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html.

Я использую эту функцию во всем моем коде. Передайте ему дату-строку или объект DateTime (Неизменяемый); он выплевывает объект DateTime или DateTimeImmutable PHP, или false, если ввод представляет собой строку типа «0000-00-00». Со вторым параметром он также может заставить результат быть неизменным или нет:

 function ensureDateTime ( $input, $immutable = NULL ) { if ( ! $input instanceof \DateTimeInterface ) { if ( in_array( $input, ['0000-00-00', '0000-00-00 00:00:00'], true ) ) { $input = false; } elseif ( $immutable ) { $input = new \DateTimeImmutable( $input ); } else { $input = new \DateTime( $input ); } } elseif ( true === $immutable && $input instanceof \DateTime ) { $input = new \DateTimeImmutable( $input->format(TIMESTAMPFORMAT), $input->getTimezone() ); } elseif ( false === $immutable && $input instanceof \DateTimeImmutable ) { $input = new \DateTime( $input->format(TIMESTAMPFORMAT), $input->getTimezone() ); } return $input; } 

В принципе «Я не уверен, с чего я начал, но я знаю, что хочу», функция.

(Примечание: немного синтаксиса PHP 7 здесь, но легко адаптируется к PHP 5)

Если вы не можете справиться с этим в своей базе данных, вы можете использовать этот фрагмент, чтобы избежать этого поведения, и подтвердите дату

 $date = new DateTime('0000-00-00 00:00'); if (DateTime::createFromFormat('Ym-d', $date->format('Ym-d'))) { // Valid } else { // Not valid }