PHP中的日期/时间验证

时间:2013-09-06 18:00:16

标签: php validation date

我正在尝试从表单提交中获取日期/时间的单个值,并将它们解析为某种格式的日期。

如果验证因任何原因(例如2月30日,13月等)失败,则结果应默认为当前时间。

if (isset($_POST['year'], $_POST['month'], $_POST['day'], $_POST['hour'], $_POST['minute']))
{
    $y = $_POST['year'];
    $m = $_POST['month'];
    $d = $_POST['day'];
    $h = $_POST['hour'];
    $i = $_POST['minute'];
    if (checkdate($m, $d, $y))
    {
        if ($h >= 0 && $h <= 23)
        {
            if ($i >= 0 && $i <= 59)
            {
                $str = $y.'-'.$m.'-'.$d.' '.$h.':'.$i.':00';
                $time = strtotime($str);
            }
            else $time = time();
        }
        else $time = time();
    }
    else $time = time();
}
else $time = time();

$datetime = date('D j M Y - H:i:s T', $time);
echo $datetime;

发生了两件我不明白的事情:

  • 如果缺少一个或多个日期值,则会出现有关checkdate()的错误...我看不出为什么验证不会在第一个if()

  • 如果缺少一个或多个时间值,最终结果是UNIX纪元?

2 个答案:

答案 0 :(得分:5)

  

如果缺少一个或多个日期值,则会出现有关checkdate()的错误...我无法看到为什么验证不会在第一个if()

时失败

设置并拥有有效值是两回事。可以设置变量并包含空字符串或null。检查以确保这些值实际包含使用empty()的值。

  

如果缺少一个或多个时间值,最终结果是UNIX Epoch?!

如果您传递date()无效的第二个参数(即有效的unix时间戳),则默认为epoch。

答案 1 :(得分:1)

执行checkdata之前的空值检查

<?php
if(!empty($y) && !empty($m) && !empty($d) && !empty($h) && !empty($i))
{
    if (checkdate($m, $d, $y))
    {
        if ($h >= 0 && $h <= 23)
        {
            if ($i >= 0 && $i <= 59)
            {
                $str = $y.'-'.$m.'-'.$d.' '.$h.':'.$i.':00';
                $time = strtotime($str);
            }
            else $time = time();
        }
        else $time = time();
    }
    else $time = time();
}
else $time = time();

$datetime = date('D j M Y - H:i:s T', $time);
echo $datetime;

?>