javascript - PHP 的日期验证有问题

标签 javascript php forms

我正在尝试验证 d-m-Y 格式的输入 type="date"中的日期。该日期不能早于今天。 我正在转换数字的差值,然后询问该数字是否小于 0。

这是我的验证函数:

public static function validateDate($date){
    $dateToday = date_create(date('d-m-Y'));
    $datetime = date_create($date);
    if(date_diff($dateToday, $datetime)->format('%a') < 0){
        return false;
    }
    else{
        return true;
    }
}

该功能不起作用。用户可以选择 future 的任何日期,它会以 YYYY-MM-DD 的形式直接进入数据库。

我在这里很迷失任何帮助,将不胜感激。

最佳答案

对于初学者来说,这可能是一个糟糕的举动:

$dateToday = date_create(date('d-m-Y'));

这很糟糕,因为日期和月份都有 2 位数字。虽然它实际上可能会给出您期望的结果,但对于美国编码人员来说,它看起来违反直觉,因为这里的日期通常是写成 m-d-Y 的。我建议 date("F j, Y") 这是一种更清晰的日期格式: var_dump(日期("F j, Y"));//输出“2018 年 12 月 8 日” 其次,您似乎没有对提供给函数的 $date 参数进行任何验证。它可能是 d-m-Y 格式的字符串,您应该通过一些验证来强制执行。

最后,您在这一行中指定的 %a 格式化程序仅提供日期差异的数字...它没有指定这是否是一个正数差异或差异。:

if(date_diff($dateToday, $datetime)->format('%a') < 0){
    //blah blah blah
}

您还需要包含 %R 格式标志才能获得差异的 +/-:

if(date_diff($dateToday, $datetime)->format('%R%a') < 0){
    //blah blah blah
}

最后,从 PHP 5.2.2 开始,您可以只比较使用比较运算符创建的日期对象。这比将字符串与零进行比较的代码更好。试试这个功能:

public static function validateDate($date){
    if (!preg_match('/^\d{2}-\d{2}-\d{4}$/', $date)) {
            throw new Exception("$date is not a valid date in d-m-Y format");
    }
    $today = date_create(date("Y-m-d"));
    $datetime = date_create($date);

    if ($datetime > $today) {
            return false;
    } else {
            return true;
    }
}

关于javascript - PHP 的日期验证有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686216/

相关文章:

javascript - 切换位置固定和静态

javascript - 使用递归反转整数

php - Doctrine: No alias was set before invoking getRootAlias() 错误

javascript - 如何通过选择标签更改占位符?

PHP/HTML 输入类型编号

PHP 表单到数据库

javascript - VSCode - 更改 IntelliSense 内的颜色

javascript - 如何为基于 youtube.com/embed URL 的链接添加类?

php - Laravel 6 错误 - Illuminate\Contracts\Container\BindingResolutionException 目标类不存在

php - 验证 App Store 收据时出现无效的 Drm 参数异常