У меня есть простая форма профиля пользователя с полем рождения
/**
* @var string
*
* @ORM\Column(name="bdate", type="date")
*/
private $bdate;
$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, и у меня нет других проблем с этим.
Не могли бы вы мне помочь? Я сумасшедший
Вопрос подтверждается для каждой даты, когда переход на летнее время происходил точно в полночь, что было для Европы/Рима с 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();
}
?>
Возможная обстановка - это установить часовую зону для другой, которая никогда не меняется точно в полночь, т.е. "Европа/Париж".
Код не только не Oracle, но и сообщение об ошибке. Но поскольку вы ссылаетесь на "хорошее" значение и "плохое" значение для "даты", я буду считать недопустимое значение для даты. Вероятно, вы путаете строковые данные с фактическим типом данных DATE. То, что вы показываете как "дата", на самом деле представляет собой не что иное, как строку символов, которую вы распознаете как дату, но когда она переходит к оператору sql, обрабатываемому базой данных, должно быть правило о том, как интерпретировать эту строку. В oracle это делается либо с установкой NLS_DATE_FORMATE, либо (лучше, на мой взгляд) с использованием функции TO_DATE.