我正在编写一个脚本,该脚本将从CSV文件导入一些数据。当我这样做时,我希望能够检查一个变量以查看它是否是一个有效的日期字符串。
我已经看到了几种检查刺痛是否是日期的方法,但其中大多数都需要您现在使用格式。我不会知道日期的格式。
现在我正在使用 strtotime((,但这不容易
$field ="May";
if(strtotime($field)){
echo "This is a date";
}
在这种情况下,"五月"是人的名字,根本不是日期。
有人能推荐更可靠的功能吗?
根据你们中的一些人的问题进行编辑。
在我的例子中,对于要作为"日期"传递的变量,它需要特定于日/月/年,因此只有"五月"将
模糊不清。基于这一点和下面的 Pauls 好点,我们还可以测试字符串是否包含一个数字,例如
$field ="May";
if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){
echo "This is a date";
}else{
echo "Nope not a date";
}
这似乎涵盖了我的迫切需求,但任何人都可以发现任何问题或提出改进建议吗?
使用 date_parse 并检查返回数组的值
$date = date_parse("May")
// ["year"] == FALSE
// ["month"] == 5
// ["day"] == FALSE
您也可以将它们传递到检查日期。
$date = date_parse($someString);
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"]))
echo "Valid date";
else
echo "Invalid date";
我认为这个问题没有多合一的答案。根据您的用例,您可能有不同的策略。
您的strtotime()
是一个完美的解决方案,但正如您所说,您最终可能会得到误报。为什么?因为可能是一个词或一个名字。但是,strtotime('May')
的结果是什么?
echo date(DateTime::ISO8601, strtotime('May'));
2012-05-21T00:00:00+0200
因此,仅给出月份将返回当前年份的日期和从给定月份的午夜开始的当前日期。一个可能的解决方案是检查您的字符串是否包含当前日期和/或当前年份,这样,您可以检查以确保您的日期是完全限定的日期并且有效。
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()
甚至正则表达式都应该可以解决问题。
但是,这有点奇怪,只有在您没有其他方法时才应使用。
我认为更好的解决方案是定义一组有效格式并插入结果以确保日期有效。
$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
);
您应该尝试涵盖大部分情况,我相信您将能够找到检查当前日期格式的正则表达式。
无论如何,您可能需要不时调整您的功能,因为没有简单的方法可以使其防弹。
这是很久以前问过的,但是环顾四周并试图避免正则表达式,我想出了这个:
function checkInputIsDate($date) {
return (bool)strpbrk($date,1234567890) && strtotime($date);
}
这是有效的,因为它消除了上面发布的问题,通过确保字符串中有带有strpbrk
的数字以及验证strtotime
输出日期,将只有一个月传递到strtotime
。
并了解了一个我不知道存在的函数。
希望这对某人有所帮助。