如何验证日期而不是日期和月份的前导零?

问题描述 投票:2回答:4

我需要在php中验证精确的日期格式。

在我的情况下,最佳日期格式应为:例如1/1/2017(没有前导零)和代码应该允许我避免日期的其余格式。

以下代码是我写的但没有结果:

if(preg_match("/([1-9]|[1-2][0-9]|3[0-1]-([1-9]|1[0-2])-^[0-9]{4})$/", $date){
    // insert into etc. etc....
}else{
    // update etc. etc....
}

问题是代码没有正确验证日期;它接受各种日期格式。

php validation date date-formatting leading-zero
4个回答
2
投票

我注意到OP提交的答案不是防弹的,所以我开始研究问题中的评论中提到的一些功能以及我自己的一些想法。

我同意apokryfos,因为使用正则表达式验证日期表达式不是最佳实践。纯正的正则表达式解决方案将成为一种越来越冗长且逐渐被理解的模式,因为它必须在过去和未来都要考虑闰年。出于这个原因,我已经调查了php提供的一些日期函数。

  1. 根据Alex Howansky的建议,date_parse_from_format()。不幸的是,它不会是这种情况的独立解决方案,因为format参数遵循DateTime::createFromFormat()的语法/规则:

enter image description here

看看dj是如何组合在一起的,mn也是如此。因此,此函数将捕获无效日期,但不会捕获不需要的前导零。

  1. 卡西米尔和希波利特所建议的strptime()。此函数使用%e提供不带前导零的匹配日。此函数没有匹配非零前导月份数字的字符。此外,此功能可能会在操作系统上出现打嗝。
  2. check_date()似乎是一个合乎逻辑的选择,但它再也不会因为零数据而退缩。此外,此功能需要比其他功能更多的数据准备,因为它需要个性化月,日和年值。
  3. 关于if(!DateTime::createFromFormat('j/n/Y', $date))的deceze建议的a slightly different scenario在这种情况下不起作用。 createFromFormat()将竭尽全力构建一个有效的日期 - 甚至像99/99/9999这样的字符串也能完成它。

为了创建最简洁的表达式,我可以使用DateTime类作为看似无懈可击的解决方案:

if (($d=DateTime::createFromFormat('n/j/Y',$date)) && $date==$d->format('n/j/Y')){
    // valid
}else{
    // invalid
}

在这种情况下,strtotime()可以使用单个条件,因为OP的日期格式使用斜杠作为分隔符,此函数将正确解析日期表达式“American-style”。

这似乎是检查没有前导零的有效日期的最简单方法:Demo Link

if(date('n/j/Y',strtotime($date))==$date){
    // valid
}else{
    // invalid
}

如果您正在处理日期时间表达式并且不希望检查时间部分,则可以在条件行之前调用此行:

$date = explode(' ', $date)[0];  // create an array of two elements: date and time, then only access date

Demo Link

要么

$date = strstr($date, ' ', true); // extract substring prior to first space

2
投票

你的日期分隔符是/而不是-,所以将\/添加到qzxswpoi的正则表达式。并在正则表达式的开头使用/

^

1
投票

你可以使用碳

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

0
投票

几个小时后,我终于找到了正确的答案。 php的正确模式是使用单引号(')而不是双引号(“)例如:

$date->format('j')

这对我来说很好...感谢大家特别对@Mohammad Hamedani来说因为表达是正确的但f ****** g引用让我发疯了

© www.soinside.com 2019 - 2024. All rights reserved.