仅针对特定日期的DateTime验证错误

时间:2016-01-04 16:17:51

标签: php validation symfony datetime

我有一个带有生日字段的简单用户个人资料表单

实体:

/**
 * @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时,我有验证错误 此值无效。

1972年5月28日

使用MySql它可以工作,但我的数据库是Oracle。 我正在使用监听器OracleSessionInit而我没有其他问题。

你能帮帮我吗?我疯了

2 个答案:

答案 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或(更好,在我看来)。