Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP检查变量是否为有效日期_Php_Date_Strtotime - Fatal编程技术网

使用PHP检查变量是否为有效日期

使用PHP检查变量是否为有效日期,php,date,strtotime,Php,Date,Strtotime,我正在编写一个脚本,该脚本将从CSV文件导入一些数据。当我这样做的时候,我希望能够检查一个变量,看看它是否是一个有效的日期字符串 我已经看到了几种检查sting是否是日期的方法,但大多数方法都要求您现在就检查格式。我不知道日期的格式 现在我正在使用strotime(),但这很容易失败 $field ="May"; if(strtotime($field)){ echo "This is a date"; } 在这种情况下,“May”是人的名字,而不是日期 有谁能推荐更可靠的功能吗 根据

我正在编写一个脚本,该脚本将从CSV文件导入一些数据。当我这样做的时候,我希望能够检查一个变量,看看它是否是一个有效的日期字符串

我已经看到了几种检查sting是否是日期的方法,但大多数方法都要求您现在就检查格式。我不知道日期的格式

现在我正在使用strotime(),但这很容易失败

$field ="May";
if(strtotime($field)){
    echo "This is a date";
}
在这种情况下,“May”是人的名字,而不是日期

有谁能推荐更可靠的功能吗

根据你们中的一些人提出的问题进行编辑。

在我的例子中,一个变量作为“日期”传递,它需要特定于一天/月/年,所以仅仅“May”就很模糊了

基于这一点和Pauls下面的要点,我们还可以测试字符串是否包含一个数字,例如

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

这似乎涵盖了我当前的需求,但有人能发现任何问题或提出改进建议吗

我认为这个问题没有一个综合的答案。根据您的用例,您可能有不同的策略

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

因此,只给出月份将返回当前年份的日期以及从给定月份的午夜开始的当前日期。一种可能的解决方案是检查字符串是否包含当前日期和/或当前年份,这样,您就可以检查以确保您的日期是完全限定的日期且有效

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
);
您应该尝试涵盖大多数情况,我相信您将能够找到检查最新日期格式的正则表达式

在任何情况下,您可能需要不时调整您的函数,因为没有简单的方法使其防弹。

使用并检查返回数组的值

$date = date_parse("May")

// ["year"] == FALSE
// ["month"] == 5
// ["day"] == FALSE
您也可以将这些信息传递到


我知道很久以前就有人问过这个问题,但环顾四周,为了避免使用正则表达式,我想到了这个:

function checkInputIsDate($date) {
    return (bool)strpbrk($date,1234567890) && strtotime($date);
}
这是因为它通过确保字符串中有数字以及验证
strotime
输出日期,消除了上面发布的问题,其中只有一个月传递到
strotime

了解了一个我不知道存在的函数


希望这对某人有所帮助。

您的脚本如何判断
May
是一个名字还是一个日期?您需要给出一些说明,说明您接受哪种值。否则“May”和其他任何值一样好。检查此人是否有姓氏是否有任何模式?月份是以数字形式还是以字符串形式出现?日期是以单元格分隔的,即A1中的月、B2中的天,还是都在一个单元格中?@Alex:仅在输入中匹配一个数字远远不能令人满意,因为它可能需要
'0May'
作为有效日期。我想你已经知道了。。。有人能看出这有什么缺陷吗?一个很小的缺陷:
date\u parse
使用
strotime
解析规则,这些规则是。可以提交返回合法日期但不是预期的数据。@Charles不需要定义良好的输入格式,任何自动解析日期的算法都会有问题我知道这是旧的,但如果使用
date\u parse(“2014-01-01 12:00:00';select*from users;”
则会说日期有效。但是,$date['error_count']将大于0,这可能是一个更好的选择。请参见@saluce
$date[“errors”]
是一个数组,因此它将始终为false。我想你需要的是
$date[“error\u count”]
$date = date_parse($someString);
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"]))
    echo "Valid date";
else
    echo "Invalid date";
function checkInputIsDate($date) {
    return (bool)strpbrk($date,1234567890) && strtotime($date);
}