Ошибка проверки DateTime только на определенную дату

1

У меня есть простая форма профиля пользователя с полем рождения

Сущность:

/**
 * @var string
 *
 * @ORM\Column(name="bdate", type="date")
 */
private $bdate;


FormType:

$builder->add('bdate', 'birthday', array(
    'input'  => 'datetime',
    'widget' => 'single_text'
));


контроллер:

if ($request->getMethod() == 'POST') {
    $form->handleRequest($request);

    if ($form->isValid()) {
        ...
    } else {
        // always here when 28 May 1972 
    }
}


Он всегда работает, но когда дата 1972-05-28 У меня ошибка проверки. Это значение недействительно.

ТОЛЬКО, когда 28 мая 1972 года

С MySql он работает, но моя база данных - это Oracle. Я использую прослушиватель OracleSessionInit, и у меня нет других проблем с этим.

Не могли бы вы мне помочь? Я сумасшедший

  • 3
    Возможно, вам также следует пометить свой вопрос на любом языке, на котором написан ваш код, поскольку это не Oracle.
  • 0
    Извините, это мой первый вопрос по StackOverflow, я удалил тег Oracle и добавил php
Теги:
datetime
validation

2 ответа

2
Лучший ответ

Вопрос подтверждается для каждой даты, когда переход на летнее время происходил точно в полночь, что было для Европы/Рима с 1966 по 1979 год:

https://www.timeanddate.com/time/change/italy/rome

Вероятно, эта ошибка в Fedora Linux 15 связана:

https://bugzilla.redhat.com/show_bug.cgi?id=1057104

Похоже, что это происходит и на текущей ubuntu и в окнах.

PHP-код для воспроизведения проблемы:

<?php
$argh = "1972-05-28";
$timezone = "Europe/Rome";
$fmt = new IntlDateFormatter(
    'it',
    IntlDateFormatter::MEDIUM,
    IntlDateFormatter::NONE,
    $timezone,
    IntlDateFormatter::GREGORIAN,
    'yyyy-MM-dd'
);
echo 'lenient of the formatter is : ';
if ($fmt->isLenient()) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}
$fmt->parse($argh);
echo "\n Trying to do parse($argh).\nResult is : " . $fmt->parse($argh);
if (intl_get_error_code() != 0) {
    echo "\nError_msg is : " . intl_get_error_message();
    echo "\nError_code is : " . intl_get_error_code();
}

$fmt->setLenient(FALSE);
echo "\nNow lenient of the formatter is : ";
if ($fmt->isLenient()) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}
$fmt->parse($argh);
echo "\n Trying to do parse($argh).\nResult is : " . $fmt->parse($argh);
if (intl_get_error_code() != 0) {
    echo "\nError_msg is : " . intl_get_error_message();
    echo "\nError_code is : " . intl_get_error_code();
}

?>

Возможная обстановка - это установить часовую зону для другой, которая никогда не меняется точно в полночь, т.е. "Европа/Париж".

0

Код не только не Oracle, но и сообщение об ошибке. Но поскольку вы ссылаетесь на "хорошее" значение и "плохое" значение для "даты", я буду считать недопустимое значение для даты. Вероятно, вы путаете строковые данные с фактическим типом данных DATE. То, что вы показываете как "дата", на самом деле представляет собой не что иное, как строку символов, которую вы распознаете как дату, но когда она переходит к оператору sql, обрабатываемому базой данных, должно быть правило о том, как интерпретировать эту строку. В oracle это делается либо с установкой NLS_DATE_FORMATE, либо (лучше, на мой взгляд) с использованием функции TO_DATE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню