PHP Regex检查日期为YYYY-MM-DD格式


97

我正在尝试检查最终用户输入的日期是否在YYYY-MM-DD中。正则表达式从来都不是我的强项,对于设置的preg_match(),我总是收到错误的返回值。

所以我假设我把正则表达式弄得一团糟,下面详述。

$date="2012-09-12";

if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
    {
        return true;
    }else{
        return false;
    }

有什么想法吗?


6
正则表达式不足以验证日期。在regex之后,您还应该使用以下两个之一:date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";或PHP checkdate ( int $month , int $day , int $year )
Tiberiu-Ionuț Stan,2012年

我暂时不尝试验证它,我只想确保它的格式为YYYY-MM-DD。
cosmicsafari 2012年

2
对于用户输入的值,除了在正则表达式之后立即提交表单之外,还有什么更好的“时间”来进行验证(因此您可以显示错误)?
Tiberiu-Ionuț Stan

公平的说,以后可以省下一个会议。
cosmicsafari 2012年

Answers:


196

试试这个。

$date="2012-09-12";

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
} else {
    return false;
}

18
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
Tiberiu-Ionuț Stan

5
为什么将此标记为正确答案?对于多个无效日期,例如2016-02-30和2016-09-31
Graham

7
这个问题是关于如何检查日期格式(YYYY-MM-DD)的,并且标记为已接受的答案并不总是最佳答案,它仅表示它对提出要求的人有用,请阅读以下精彩教程:stackoverflow。 com / tour
stramin'2

@Graham旧帖子,我知道但与Stramin同意-这个问题询问格式验证-不是实际日期验证
treyBake

98

为此最好使用另一种机制。

现代化的解决方案,具有DateTime

$dt = DateTime::createFromFormat("Y-m-d", $date);
return $dt !== false && !array_sum($dt::getLastErrors());

这也$dt !== false可以验证输入内容:确保可以使用指定的格式来解析日期,并且array_sum窍门是确保PHP不会“按月移动”的简洁方法(例如,考虑1月32日为2月1日)。请参阅DateTime::getLastErrors()以获取更多信息。

与老派的解决方案explodecheckdate

list($y, $m, $d) = array_pad(explode('-', $date, 3), 3, 0);
return ctype_digit("$y$m$d") && checkdate($m, $d, $y);

这也验证了输入也是一个有效日期。您当然可以使用正则表达式来做到这一点,但这会大惊小怪-2月29日根本无法使用正则表达式进行验证。

这种方法的缺点是您必须非常小心地拒绝所有可能的“不良”输入,而在任何情况下都不会发出通知。这是如何做:

  • explode仅限返回3个令牌(因此,如果输入为“ 1-2-3-4”,$d则将变为“ 3-4”)
  • ctype_digit 用于确保输入不包含任何非数字字符(破折号除外)
  • array_pad使用(具有将导致checkdate失败的默认值)确保返回足够的元素,以便如果输入为“ 1-2” list()将不会发出通知

+1,一直使用DateTime,从未听说过checkdate……可耻。
k102 2012年

@ k102:DateTime也可以这样做。我刚刚整理好答案,如果您愿意,请再次查看。
2012年

查看PHP手册,看起来第一个解决方案将验证不完整的日期(填写当前日期中缺少的值)。
user2428118 2014年

解决方案1的另一个问题是:“不存在的值翻转”,例如2001-02-31变成2001-03-03。(尽管OP尚未明确询问这是不可能的。)
user2428118 2014年

1
@ user2428118:您是否尝试了完全按照给定的解决方案#1,或者只是尝试了第一行?您是否单击了我提供给文档的链接getLastErrors
2014年

42

yyyy-mm-dd: /^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g

yyyy / mm / dd: /^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g

mm-dd-yyyy: /^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g

mm / dd / yyyy: /^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g

dd / mm / yyyy: /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g

dd-mm-yyyy: /^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g


上面的所有工作都适用于1900年至9999年的日期,这在大多数情况下都是必需的,比我的尝试短74个字符(采用yyyy-mm-dd格式)。如果您想要1900年之前的日期,则对Shyju答案的细微调整将允许从1000年开始,并且要短23个字符:^(((([1-9] \ d {3})\-(0 [13578] | 1 [02])\-(0 [1-9] | [12] \ d | 3 [01]))|((((19 | [2-9] \ d)\ d {2})\-( 0 [13456789] | 1 [012])\-(0 [1-9] | [12] \ d | 30))|(([[1-9] \ d {3})\-02 \-(0 [1-9] | 1 \ d | 2 [0-8]))|(([[1-9] \ d(0 [48] | [2468] [048] | [13579] [26])|( (16 | [2468] [048] | [3579] [26])00))\-02 \ -29))$
Graham

36

条件:

每年被4整除的年份是is年,除非它可以被100整除,除非可以被400整除。

2004 - leap year - divisible by 4
1900 - not a leap year - divisible by 4, but also divisible by 100
2000 - leap year - divisible by 4, also divisible by 100, but divisible by 400

2月在a年有29天,在非a年有28天

4月,6月,9月和11月的30天

一月,三月,五月,七月,八月,十月和十二月的31天

测试:

以下日期均应通过验证:

1976-02-29
2000-02-29
2004-02-29
1999-01-31

以下日期均应通过验证:

2015-02-29
2015-04-31
1900-02-29
1999-01-32
2015-02-00

范围:

我们将测试1000年1月1日至2999年12月31日之间的日期。从 技术上讲,当前使用的格里高利历仅在1753年用于大英帝国,并在1600年代的不同年份用于欧洲国家,但我不会担心那个。

正则表达式测试a年:

可除以400的年份:

1200|1600|2000|2400|2800
can be shortened to:
(1[26]|2[048])00

if you wanted all years from 1AD to 9999 then this would do it:
(0[48]|[13579][26]|[2468][048])00
if you're happy with accepting 0000 as a valid year then it can be shortened:
([13579][26]|[02468][048])00

可被4整除的年份:

[12]\d([02468][048]|[13579][26])

被100整除的年份:

[12]\d00

无法被100整除:

[12]\d([1-9]\d|\d[1-9])

年份可以被100整除,但不能被400整除:

((1[1345789])|(2[1235679]))00

可被4整除但不能被100整除:

[12]\d([2468][048]|[13579][26]|0[48])

years年:

divisible by 400 or (divisible by 4 and not divisible by 100)
((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48])

无法被4整除:

[12]\d([02468][1235679]|[13579][01345789])

不是a年:

Not divisible by 4 OR is divisible by 100 but not by 400
([12]\d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00)

有效月份,不包括二月(MM-DD):

((01|03|05|07|08|10|12)-(0[1-9]|[12]\d|3[01]))|((04|06|09|11)-(0[1-9]|[12]\d|30))
shortened to:
((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30))

2月,共28天:

02-(0[1-9]|1\d|2[0-8])

2月,共29天:

02-(0[1-9]|[12]\d)

有效日期:

(leap year followed by (valid month-day-excluding-february OR 29-day-february)) 
OR
(non leap year followed by (valid month-day-excluding-february OR 28-day-february))

((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8]))))

因此,这里有一个正则表达式,用于YYYY-MM-DD格式的日期(1000年1月1日至2999年12月31日)。

我怀疑它可以缩短很多,但我会留给其他人考虑。

那将匹配所有有效日期。如果您只希望它仅包含一个日期而没有其他任何内容时才有效,则将其包装^( )$如下:

^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$

如果您希望将其作为可选的日期输入项(例如,可以为空白或有效日期)^$|,请在开头添加,例如:

^$|^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$

7
这是一个英雄的表达,并且解释得很好。
2016年

您是否有充分的证据证明它会通过每个有效案例,而不会在每个无效案例中失败?
阿什拉富德伊斯兰教医学

@Md Ashraful Islam No
Graham

@Graham Altough没问题,我们正在网站上使用它。我希望不会发生任何问题。
Ashraful伊斯兰教

@Md Ashraful Islam-我们也使用过它,并且到目前为止还没有任何问题
Graham

18

您可以这样进行:

if (preg_match("/\d{4}\-\d{2}-\d{2}/", $date)) {
    echo 'true';
} else {
    echo 'false';
}

但您最好使用以下一种:

$date = DateTime::createFromFormat('Y-m-d', $date);
if ($date) {
    echo $date -> format('Y-m-d');
}

在这种情况下,您将获得一个比字符串更易于使用的对象。


1
此处使用的dateTime技术将对日期(如2016-05-44)返回true,这不是实际日期
nonybrighto

这不是一个好例子,特别是如果您想获取date(Ymd)。示例:0175-44-19927将通过。
Attila Naghi

7

我知道这是一个老问题。但是我认为我有一个很好的解决方案。

$date = "2016-02-21";
$format = "Y-m-d";

if(date($format, strtotime($date)) == date($date)) {
    echo "true";
} else {
    echo "false";
}

你可以试试。如果您将日期更改为21.02.2016,则回显为false。而且,如果您在此之后将格式更改为dmY,则回声为真。

有了这个简单的代码,您应该能够检查使用的日期格式,而不必由正则表达式检查。

也许有人会在每种情况下进行测试。但是我认为我的想法总体上是正确的。对我来说,这似乎合乎逻辑。


我认为您不需要在if行的$ date附近添加date()。if(date($ format,strtotime($ date))== $ date)-应该足够
iateadonut

7

您可以将preg_match与checkdate php函数一起使用

$date  = "2012-10-05";
$split = array();
if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $split))
{
    return checkdate($split[2], $split[3], $split[1]);
}

return false;

返回preg_match(“ / ^([0-9] {4})-([0-9] {2})-([0-9] {2})$ /”,$ date,$ split))&& checkdate($ split [2],$ split [3],$ split [1]);
Tiberiu-Ionuț Stan

5

preg_match需要一个/或另一个char作为分隔符。

preg_match("/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/",$date)

您还应该检查该日期的有效性,这样您就不会得到像9999-19-38这样的结果

bool checkdate ( int $month , int $day , int $year )

3

您也可以这样:

if (DateTime::createFromFormat('Y-m-d', $date)->format('Y-m-d') === $date) {

    // date is correctly formatted and valid, execute some code

}

这将不仅检查格式,还检查日期本身的有效性,因为DateTime它将仅创建有效日期,并且这需要与输入匹配。


3

您可以使用

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

$date="2012-09-12";    
echo validateDate($date, 'Y-m-d'); // true or false

2

YYYY-MM-DD在一行语句中检查并验证日期

function isValidDate($date) {
    return preg_match("/^(\d{4})-(\d{1,2})-(\d{1,2})$/", $date, $m)
        ? checkdate(intval($m[2]), intval($m[3]), intval($m[1]))
        : false;
}

输出将是:

var_dump(isValidDate("2018-01-01")); // bool(true)
var_dump(isValidDate("2018-1-1"));   // bool(true)
var_dump(isValidDate("2018-02-28")); // bool(true)
var_dump(isValidDate("2018-02-30")); // bool(false)

允许不带前导零的日期和月份。如果您不想这样做,则regexp应该为:

"/^(\d{4})-(\d{2})-(\d{2})$/"

1

如果要匹配该类型的日期,请使用:

preg_match("~^\d{4}-\d{2}-\d{2}$~", $date)

1

这应该告诉您格式是否有效以及输入日期是否有效。

    $datein = '2012-11-0';

    if(preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/', $datein)){
        echo 'good';
    }else{
        echo 'no good';
    }

1

如果有帮助,请使用jnY格式的正则表达式(年份必须大于2018):

if (preg_match('/^([1-9]|[1-2][0-9]|[3][0-1])\-([1-9]|[1][0-2])\-(?:20)([1][8-9]|[2-9][0-9])$/', $date)) {
   // Do stuff
}

1

格式1:$ format1 =“ 2012-12-31”;

格式2:$ format2 =“ 31-12-2012”;

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$format1)) {
    return true;
} else {
    return false;
}

if (preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-[0-9]{4}$/",$format2)) {
    return true;
} else {
    return false;
}

1

可能对某人有用:

$patterns = array(
            'Y'           =>'/^[0-9]{4}$/',
            'Y-m'         =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])$/',
            'Y-m-d'       =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])$/',
            'Y-m-d H'     =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\s(0|[0-1][0-9]|2[0-4])$/',
            'Y-m-d H:i'   =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\s(0|[0-1][0-9]|2[0-4]):?(0|[0-5][0-9]|60)$/',
            'Y-m-d H:i:s' =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\s(0|[0-1][0-9]|2[0-4]):?((0|[0-5][0-9]):?(0|[0-5][0-9])|6000|60:00)$/',
        );
echo preg_match($patterns['Y'], '1996'); // true
echo preg_match($patterns['Y'], '19966'); // false
echo preg_match($patterns['Y'], '199z'); // false
echo preg_match($patterns['Y-m'], '1996-0'); // false
echo preg_match($patterns['Y-m'], '1996-09'); // true
echo preg_match($patterns['Y-m'], '1996-1'); // true
echo preg_match($patterns['Y-m'], '1996/1'); // true
echo preg_match($patterns['Y-m'], '1996/12'); // true
echo preg_match($patterns['Y-m'], '1996/13'); // false
echo preg_match($patterns['Y-m-d'], '1996-11-1'); // true
echo preg_match($patterns['Y-m-d'], '1996-11-0'); // false
echo preg_match($patterns['Y-m-d'], '1996-11-32'); // false
echo preg_match($patterns['Y-m-d H'], '1996-11-31 0'); // true
echo preg_match($patterns['Y-m-d H'], '1996-11-31 00'); // true
echo preg_match($patterns['Y-m-d H'], '1996-11-31 24'); // true
echo preg_match($patterns['Y-m-d H'], '1996-11-31 25'); // false
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 2400'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:00'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:59'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:60'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:61'); // false
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:61'); // false
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:6000'); // true
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:60:00'); // true
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:59:59'); // true
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:59:60'); // false
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:60:01'); // false

'1996-11-31 24:00'); // true,真的吗?此外,有时每分钟有61秒,请参阅:en.wikipedia.org/wiki/Leap_second
Toto

1

验证通用日期格式的功能:

function validateDate($date, $format = 'Y-m-d') {
  $d = DateTime::createFromFormat($format, $date);
  return $d && $d->format($format) == $date;
}

执行示例:

var_dump(validateDate('2021-02-28')); // true
var_dump(validateDate('2021-02-29')); // false

请始终将答案放在上下文中,而不仅仅是粘贴代码。有关更多详细信息,请参见此处。请同时编辑您的答案以在markdown块中包含代码的所有部分
gehbiszumeis

0

这完全取决于您希望此功能的严格程度。例如,如果您不想允许大于12的月份和大于31的日子(不取决于月份,则需要编写日期逻辑),则可能会变得非常复杂:

function checkDate($date)
{
  $regex = '/^' . 
    '(' .

    // Allows years 0000-9999
    '(?:[0-9]{4})' .
    '\-' .

    // Allows 01-12
    '(?:' .
    '(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|' .
    '(?:11)|(?:12)' .
    ')' .
    '\-' .

    // Allows 01-31
    '(?:' .
    '(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|' .
    '(?:11)|(?:12)|(?:13)|(?:14)|(?:15)|(?:16)|(?:17)|(?:18)|(?:19)|(?:20)|' .
    '(?:21)|(?:22)|(?:23)|(?:24)|(?:25)|(?:26)|(?:27)|(?:28)|(?:29)|(?:30)|' .
    '(?:31)' .
    ')' .

    '$/';

  if ( preg_match($regex, $date) ) {
    return true;
  }

  return false;
}

$result = checkDate('2012-09-12');

就我个人而言,我只是去: /^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/


4
此正则表达式不必要地复杂。0[1-9]|1[0-2]匹配月份01-12和0[1-9]|[12][0-9]|3[01]日期01-31。
estrar 2014年

当我呕吐时打扰一下
AlxVallejo 2016年

0

要使用php中的日期,您应遵循php标准,以便给定的正则表达式可确保您具有可以与PHP一起使用的有效日期。

    preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)

您的rgex错误,将不匹配1980-01-01但将匹配2100-02-29
Toto

0

此方法对于验证PHP中的日期很有用。当前方法适用于mm / dd / yyyy格式。您必须根据格式和explode中的定界符在checkdate中更新参数序列。

    function isValidDate($dt)
    {
        $dtArr = explode('/', $dt);
        if (!empty($dtArr[0]) && !empty($dtArr[1]) && !empty($dtArr[2])) {
            return checkdate((int) $dtArr[0], (int) $dtArr[1], (int) $dtArr[2]);
        } else {
            return false;
        }
    }

0

[如果您使用Symfony 4.1.2,请尝试此操作] [1]

  $validDate = explode("-",$request->get('date'));
        if (checkdate(filter_var($validDate[1],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[0],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[2],FILTER_SANITIZE_NUMBER_INT))){
            $date = date_create(filter_var($request->get('date'),FILTER_SANITIZE_SPECIAL_CHARS));
        }else{
            return $this->redirectToRoute('YOUR_ROUTE');
        }

0

从Laravel 5.7和日期格式开始,即:12/31/2019

function checkDateFormat(string $date): bool
{
    return preg_match("/^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/[0-9]{4}$/", $date);
}

0

我正在搜索“如何验证日期”并找到了此解决方案,它的年代很久,但是我将分享以下可用于在php中验证日期的方法,

checkdate('01', '31', '2019')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.