【问题标题】:validate different date formats验证不同的日期格式
【发布时间】:2015-09-29 19:50:05
【问题描述】:

我遇到了麻烦,我需要验证一个与不同日期格式一致的日期,例如

18-11-1991
1991-11-18
18/11/1991
1991/11/18

我需要验证日期是否为字符串,匹配这 4 种格式中的任何一种,如果不匹配,则发送错误,但我想不出如何,寻找用于其中一种格式的验证方法,我碰巧复制了4,但唯一的区别是 1 而不是 4?请帮忙。

【问题讨论】:

  • 如果您不知道月份在哪里,一天在哪里,那么当一天低于 13 时,这是不可能的。(但您总是可以有年份)。换句话说,您必须限制可能的格式。
  • Aaa 好的,我正在处理一个填充了不同日期的 Excel 文件,所以我不能限制传入的数据,但如果我可以从控制器验证,让我们看看我能做什么做。
  • @sioei:正如我所说,你什么也不能做(或者只能做假设)。但是,如果从文档中抓取很多日期,则可以推断出使用的格式。

标签: php regex validation


【解决方案1】:

这不是一个完整的日期检查,因为可以构建无效日期,但可能足以满足您的目的(并且当没有值大于 12 时,无法检测日期和月份的位置,反之亦然 -在我的代码中,当没有值大于 19 时也是如此)。我只是将所有格式转换为 iso 日期,因为它有利于排序或与 mysql 一起使用:

$dates = array();
$dates[] = "18-11-1991";
$dates[] = "1991-11-18";
$dates[] = "18/11/1991";
$dates[] = "1991/11/18";
$dates[] = "1991 11 18";

foreach($dates as $date) {
    $iso_date = "";
    if(preg_match("/^([0-3][0-9])-([0-1][0-9])-([0-9]{4})\$/",$date,$reg)) {
        $iso_date = $reg[3]."-".$reg[2]."-".$reg[1];
    } elseif(preg_match("/^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\$/",$date,$reg)) {
        $iso_date = $date;
    } elseif(preg_match("/^([0-3][0-9])\/([0-1][0-9])\/([0-9]{4})\$/",$date,$reg)) {
        $iso_date = $reg[3]."-".$reg[2]."-".$reg[1];
    } elseif(preg_match("/^([0-9]{4})\/([0-1][0-9])\/([0-3][0-9])\$/",$date,$reg)) {
        $iso_date = $reg[1]."-".$reg[2]."-".$reg[3];
    }
    if(empty($iso_date)) {
        echo "<br>ERROR: date $date doesn't match one of the supported formats.";
    } else {
        echo "<br>$date = $iso_date";
    }
}

这将输出:

18-11-1991 = 1991-11-18
1991-11-18 = 1991-11-18
18/11/1991 = 1991-11-18
1991/11/18 = 1991-11-18
ERROR: date 1991 11 18 doesn't match one of the supported formats.

编辑:如果您愿意,可以添加对 iso_date 的检查,如果它是有效日期:

$p = explode("-",$iso_date);
if(count($p)==3 and checkdate($p[1],$p[2],$p[1])) {
    echo " (date is valid)";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多