检查variables是否与PHP有效的date

我正在处理一个将从CSV文件导入一些数据的脚本。 因为我这样做,我想能够检查一个variables,看看它是否是一个有效的datestring。

我已经看到了几种方法来检查是否是一个date,但他们中的大多数需要你现在的格式。 我不会知道date的格式。

现在我正在使用strtotime(),但是这并不容易

$field ="May"; if(strtotime($field)){ echo "This is a date"; } 

在这种情况下,“五月”是人名,而不是date。

任何一个可以推荐更可靠的function?

根据您的一些问题编辑。

对于一个variables作为一个“date”在我的情况下,它将需要特定于一天/一年/一年,所以只是“五月”将模糊计数。

基于这一点以及Pauls的好点,我们也可以testing一下,看看string是否包含数字,比如

 $field ="May"; if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){ echo "This is a date"; }else{ echo "Nope not a date"; } 

这似乎涵盖了我的迫切需求,但是任何一个问题都可以find或者提出改进build议?

使用date_parse并检查返回数组的值

 $date = date_parse("May") // ["year"] == FALSE // ["month"] == 5 // ["day"] == FALSE 

您也可以将其传入checkdate 。

 $date = date_parse($someString); if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"])) echo "Valid date"; else echo "Invalid date"; 

我不认为这个问题有一个一个一个的答案。 根据您的使用情况,您可能有不同的策略。

你的strtotime()是一个完美的解决scheme,但正如你所说,你最终可能会误报。 为什么? 因为可能是一个词或一个名字。 然而, strtotime('May')的结果是什么?

 echo date(DateTime::ISO8601, strtotime('May')); 2012-05-21T00:00:00+0200 

因此,仅给出月份将返回当前年份的date以及从给定月份的午夜开始的当前date。 一个可能的解决办法是检查你的string是否有当前date和/或当前年份,这样,你可以检查以确保你的date是一个完全合格的date和有效的。

 echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false) 1970-01-01T01:00:00+0100 echo date(DateTime::ISO8601, strtotime('May 21')); 2012-05-21T00:00:00+0200 

一个简单的strpos()甚至正则expression式应该可以做到这一点。

不过,这有点奇怪,只有在没有其他方法的情况下才能使用。

我相信一个更好的解决scheme是定义一组有效格式并插入结果以确保date有效。

 $validDateFormatPatterns = array( '[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012, 'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012 ); 

你应该尝试覆盖大部分的情况,我相信你将能够find正则expression式来检查最新的date格式。

无论如何,你可能需要不时调整你的function,因为没有简单的方法来使它防弹。

我知道这是很久以前问的,但是为了避免这个问题而试图避免使用正则expression式,我想出了这个:

 function checkInputIsDate($date) { return (bool)strpbrk($date,1234567890) && strtotime($date); } 

这是有效的,因为它将上面发布的问题带走,通过确保strpbrk中的string中包含strpbrk以及validationstrtotime输出date,只有一个月传入strtotime

并了解到我不知道的function。

希望这有助于某人。