如何在日期和月份不带前导零的情况下验证日期?

How to validate dates without leading zero on day and month?

我需要验证 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....
}

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

您的日期分隔符是 / 而不是 -,因此请将 \/ 添加到 / 的正则表达式中。并在正则表达式的开头使用 ^

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

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

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

这对我来说很好...感谢大家,尤其是@Mohammad Hamedani,因为表达是正确的,但他妈的引用让我发疯

看到OP提交的答案不是万能的,于是开始研究问题下评论里提到的一些功能和自己的一些想法。

我同意 apokryfos 的观点,使用正则表达式来验证日期表达式不是最佳做法。纯正则表达式解决方案将成为越来越冗长且越来越难以理解的模式,因为它必须考虑过去和未来的闰年。为此,我调查了 php 提供的一些日期函数。

  1. date_parse_from_format() as suggested by Alex Howansky. Unfortunately, it will not be a stand-alone solution for this case because the format parameter obeys the syntax/rules of DateTime::createFromFormat():

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

  1. strptime() 正如 Casimir et Hippolyte 所建议的。此函数使用 %e 提供不带前导零的匹配日期。此函数没有匹配非零前导月份数字的字符。此外,此功能基于操作系统可能会出现问题。

  2. check_date() 似乎是一个合乎逻辑的选择,但它不会在零引导数字面前退缩。此外,此函数比其他函数需要更多的数据准备,因为它需要个性化月、日和年值。

  3. deceze 就 a slightly different scenario 建议的
  4. if(!DateTime::createFromFormat('j/n/Y', $date)) 在这种情况下不起作用。 createFromFormat() 将竭尽全力构建一个有效日期——即使是像 99/99/9999 这样的字符串也能通过。


在尝试创建最简洁的表达式时,我可以使用 DateTime class:

提供看似可靠的解决方案
if (($d=DateTime::createFromFormat('n/j/Y',$date)) && $date==$d->format('n/j/Y')){
    // valid
}else{
    // invalid
}

strtotime() can be used with a single condition for this case because the OP's date format uses slashes as a delimiter and this function will correctly parse the date expression "American-style".

This seems to be the simplest way to check for a valid date without leading zeros: 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

您可以使用 Carbon

$date->format('j')