我有一个带有生日字段的简单用户个人资料表单
/**
* @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时,我有验证错误
此值无效。
仅
使用MySql它可以工作,但我的数据库是Oracle。 我正在使用监听器OracleSessionInit而我没有其他问题。
你能帮帮我吗?我疯了答案 0 :(得分:2)
这个问题在夏令时变化恰好发生在午夜的每个日期得到确认,欧洲/罗马从1966年到1979年就是这种情况:
https://www.timeanddate.com/time/change/italy/rome
Fedora Linux 15中的这个错误可能已经连接:
https://bugzilla.redhat.com/show_bug.cgi?id=1057104
它似乎也发生在当前的ubuntu和Windows上。
重现问题的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();
}
?>
可能的解决方法是将时区设置为不同的时区,这个时区在午夜时间不会发生变化,即&#34;欧洲/巴黎&#34;。
答案 1 :(得分:0)
代码不仅不是Oracle,也不是错误消息。但是既然你引用了一个好的&#34;价值和&#34;坏&#34; &#34; date&#34;的价值我假设无效值是日期。您可能会将字符串数据与实际的DATE数据类型混淆。你表现为&#34;日期&#34;实际上只不过是一个你认为是日期的字符串,但当它归结为数据库处理的sql语句时,必须有一个关于如何解释该字符串的规则。在oracle中,可以使用TO_DATE函数设置NLS_DATE_FORMATE或(更好,在我看来)。