检查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。
希望这有助于某人。