date_create_from_format接受无效日期作为输入

时间:2011-04-28 22:46:03

标签: php parsing date

PHP date_create_from_format函数接受不存在但格式有效的日期。

我希望此函数的行为类似于date命令:

niloct@HP-Mini:~$ date --date="29/02/2011" +%s
date: invalid date `29/02/2011'

虽然这是在php中发生的事情:

$tmp = date_create_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00", timezone_open('America/Sao_Paulo'));
var_dump($tmp);
/*
output: object(DateTime)#28 (3) { ["date"]=> string(19) "2011-03-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(17) "America/Sao_Paulo" }
*/

是否可以避免这种自动转换,在这种情况下函数会返回-1

niloct@HP-Mini:~$ php -v
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:08:14) 

谢谢。

3 个答案:

答案 0 :(得分:5)

您可以使用date_parse_from_formatcheckdate的组合来查看它是否是有效的日历日期。

示例:

$date = date_parse_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00");

if (checkdate($date['month'], $date['day'], $date['year'])) {
    echo "Valid date";
}
else {
    echo "Invalid date";
}

答案 1 :(得分:0)

我发现在date_get_last_errors之后调用date_create_from_format已经为解析后的字符串,数组warningserrors以及计数器{{1}提供了所有类型的验证}和warning_count

所以只需检查计数器是否有零警告和错误就足够了。

修改了一些测试的代码:

error_count

上述脚本计算创建的日期时间的unix时间戳。

答案 2 :(得分:-1)

这将有效:

 $format = 'd/m/Y H:i';
   $date = DateTime::createFromFormat($format, Input::get('start_date'));

  return $date->format('Y/m/d H:i');