我从一个API接收到一个日期字符串,它的格式是yyyy-mm-dd。
我目前正在使用一个正则表达式来验证字符串格式,这是可以工作的,但我可以看到一些情况下,根据字符串,它可能是一个正确的格式,但实际上是一个无效的日期。例如,2013年13月1日。
在PHP中是否有更好的方法来获取一个字符串,如2013-13-01,并判断它是否是yyyy-mm-dd格式的有效日期?
我从一个API接收到一个日期字符串,它的格式是yyyy-mm-dd。
我目前正在使用一个正则表达式来验证字符串格式,这是可以工作的,但我可以看到一些情况下,根据字符串,它可能是一个正确的格式,但实际上是一个无效的日期。例如,2013年13月1日。
在PHP中是否有更好的方法来获取一个字符串,如2013-13-01,并判断它是否是yyyy-mm-dd格式的有效日期?
当前回答
我有这样的东西,即使使用PHP,我也喜欢寻找函数式解决方案。例如,@migli给出的答案非常好,非常灵活和优雅。
但它有一个问题:如果需要用相同的格式验证大量DateTime字符串怎么办?你将不得不到处重复这种格式,这违背了DRY原则。我们可以把格式放在一个常量中,但是,我们仍然必须把这个常量作为参数传递给每个函数调用。
但是不要再害怕了!我们可以用咖喱来拯救我们!PHP并没有让这个任务变得愉快,但仍然可以用PHP实现curry:
<?php
function validateDateTime($format)
{
return function($dateStr) use ($format) {
$date = DateTime::createFromFormat($format, $dateStr);
return $date && $date->format($format) === $dateStr;
};
}
那么,我们刚刚做了什么?基本上,我们将函数体包装在一个匿名函数中,并返回这样的函数。我们可以像这样调用验证函数:
validateDateTime('Y-m-d H:i:s')('2017-02-06 17:07:11'); // true
是啊,差别不大…但真正的力量来自于部分应用的函数,这是通过咖喱实现的:
// Get a partially applied function
$validate = validateDateTime('Y-m-d H:i:s');
// Now you can use it everywhere, without repeating the format!
$validate('2017-02-06 17:09:31'); // true
$validate('1999-03-31 07:07:07'); // true
$validate('13-2-4 3:2:45'); // false
函数式编程!
其他回答
你也可以解析月份日期和年份的日期,然后你可以使用PHP函数checkdate(),你可以在这里读到:http://php.net/manual/en/function.checkdate.php
你也可以试试这个:
$date="2013-13-01";
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date))
{
echo 'Date is valid';
}else{
echo 'Date is invalid';
}
使用php预构建函数的简单方式:
function checkmydate($date) {
$tempDate = explode('-', $date);
// checkdate(month, day, year)
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
Test
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false
这个选项不仅简单,而且几乎可以接受任何格式,尽管使用非标准格式可能会有bug。
$timestamp = strtotime($date);
return $timestamp ? $date : null;
检查给定日期是否有效的最简单方法可能是使用strtotime将其转换为unixtime,将其格式化为给定日期的格式,然后进行比较:
function isValidDate($date) {
return date('Y-m-d', strtotime($date)) === $date;
}
当然,你可以使用正则表达式来检查有效性,但它将仅限于给定的格式,每次你都必须编辑它来满足另一种格式,而且它也会比所需的更多。内置函数是实现作业的最佳方式(在大多数情况下)。
使用checkdate函数验证:
$date = '2019-02-30';
$date_parts = explode( '-', $date );
if(checkdate( $date_parts[1], $date_parts[2], $date_parts[0] )){
//date is valid
}else{
//date is invalid
}