Как запретить PHP конвертировать объект DateTime со значением 0000-00-00 в -0001-11-30 - PullRequest
10 голосов
/ 06 июля 2011

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

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

Ответы [ 4 ]

8 голосов
/ 06 июля 2011

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

5 голосов
/ 06 июля 2011

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

0 голосов
/ 25 октября 2017

Я использую эту функцию во всем коде. Передайте ей строку, похожую на дату, или объект DateTime (Immutable); он будет выплевывать PHP DateTime или DateTimeImmutable объект, или false, если input является строкой, похожей на «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)

0 голосов
/ 21 августа 2015

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

$date = new DateTime('0000-00-00 00:00');
if (DateTime::createFromFormat('Y-m-d', $date->format('Y-m-d'))) {
    // Valid
} else {
    // Not valid
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...