正确地确定datestring是否是该格式的有效date

我从API接收datestring,格式为yyyy-mm-dd

我目前正在使用正则expression式来validationstring格式,这工作正常,但我可以看到一些情况下,它可能是一个正确的格式根据string,但实际上是一个无效的date。 即2013-13-01 ,例如。

有没有更好的方式在PHP采取一个string,如2013-13-01并告诉如果这是一个有效的date或格式为yyyy-mm-dd

你可以从PHP.net使用这个函数的稍微修改版本。 它使用DateTime类:

 function validateDate($date) { $d = DateTime::createFromFormat('Ym-d', $date); return $d && $d->format('Ym-d') === $date; } 

testing用例:

 var_dump( validateDate('2013-13-01') ); // false var_dump( validateDate('20132-13-01') ); // false var_dump( validateDate('2013-11-32') ); // false var_dump( validateDate('2012-2-25') ); // false var_dump( validateDate('2013-12-01') ); // true var_dump( validateDate('1970-12-01') ); // true var_dump( validateDate('2012-02-29') ); // true 

演示!

确定任何string是否是date

 function checkIsAValidDate($myDateString){ return (bool)strtotime($myDateString); } 

使用简单的方式与PHP预buildfunction:

 function checkmydate($date) { $tempDate = explode('-', $date); // checkdate(month, day, year) return checkdate($tempDate[1], $tempDate[2], $tempDate[0]); } 

testing

  checkmydate('2015-12-01'); //true checkmydate('2015-14-04'); //false 

这个选项不仅简单,而且几乎可以接受任何格式,尽pipe使用非标准格式可能会出现问题。

 $timestamp = strtotime($date); return $timestamp ? $date : null; 

确定string是否是date,即使string是非标准格式

(时间不接受任何自定义格式)

 <?php function validateDateTime($dateStr, $format) { date_default_timezone_set('UTC'); $date = DateTime::createFromFormat($format, $dateStr); return $date && ($date->format($format) === $dateStr); } // These return true validateDateTime('2001-03-10 17:16:18', 'Ymd H:i:s'); validateDateTime('2001-03-10', 'Ym-d'); validateDateTime('2001', 'Y'); validateDateTime('Mon', 'D'); validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a'); validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a'); validateDateTime('03.10.01', 'mdy'); validateDateTime('10, 3, 2001', 'j, n, Y'); validateDateTime('20010310', 'Ymd'); validateDateTime('05-16-18, 10-03-01', 'his, jm-y'); validateDateTime('Monday 8th of August 2005 03:12:46 PM', 'l jS \of FY h:i:s A'); validateDateTime('Wed, 25 Sep 2013 15:28:57', 'D, d MYH:i:s'); validateDateTime('17:03:18 is the time', 'H:m:s \i\s \t\h\e \t\i\m\e'); validateDateTime('17:16:18', 'H:i:s'); // These return false validateDateTime('2001-03-10 17:16:18', 'YmD H:i:s'); validateDateTime('2001', 'm'); validateDateTime('Mon', 'Dm-y'); validateDateTime('Mon', 'Dm-y'); validateDateTime('2001-13-04', 'Ym-d'); 

你也可以parsing月份date和年份的date,然后你可以使用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'; } 

按照cl-sah的回答,但是这听起来更好,更短…

 function checkmydate($date) { $tempDate = explode('-', $date); return checkdate($tempDate[1], $tempDate[2], $tempDate[0]); } 

testing

 checkmydate('2015-12-01');//true checkmydate('2015-14-04');//false 

我有这个东西,即使使用PHP,我也喜欢findfunction性的解决scheme。 所以,例如@migli给出的答案确实很好,高度灵活和高雅。

但是它有一个问题:如果你需要用相同的格式validation很多DateTimestring呢? 你将不得不重复格式,什么是违反原则。 我们可以把格式放在一个常量中,但是,我们仍然需要将常量作为parameter passing给每个函数调用。

但是不要再害怕了! 我们可以用咖喱来拯救我们! PHP并没有使这个任务愉快,但它仍然可以实现与PHP的currying:

 <?php function validateDateTime($format) { return function($dateStr) use ($format) { $date = DateTime::createFromFormat($format, $dateStr); return $date && $date->format($format) === $dateStr; }; } 

那么,我们刚刚做了什么? 基本上我们用匿名函数包装函数体,并返回这个函数。 我们可以像这样调用validation函数:

 validateDateTime('Ymd H:i:s')('2017-02-06 17:07:11'); // true 

是的,没有太大的区别…但是真正的力量来自部分应用的function ,通过柯里化成为可能:

 // Get a partially applied function $validate = validateDateTime('Ymd 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 

函数式编程FTW!

经testing的正则expression式解决scheme:

  function isValidDate($date) { if (preg_match("/^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$/", $date)) { return $date; } return null; } 

如果date无效或者不是yyyy-mm-dd格式,则返回null,否则返回date。

  /**** date check is a recursive function. it's need 3 argument MONTH,DAY,YEAR. ******/ $always_valid_date = $this->date_check($month,$day,$year); private function date_check($month,$day,$year){ /** checkdate() is a php function that check a date is valid or not. if valid date it's return true else false. **/ $status = checkdate($month,$day,$year); if($status == true){ $always_valid_date = $year . '-' . $month . '-' . $day; return $always_valid_date; }else{ $day = ($day - 1); /**recursive call**/ return $this->date_check($month,$day,$year); } } 

这个怎么样?

我们只是使用try-catch块。

 $dateTime = 'an invalid datetime'; try { $dateTimeObject = new DateTime($dateTime); } catch (Exception $exc) { echo 'Do something with an invalid DateTime'; } 

这种方法不仅限于一个date/时间格式,而且您也不需要定义任何函数。

试试这个:

 $date = "2017-10-01"; function date_checker($input,$devider){ $output = false; $input = explode($devider, $input); $year = $input[0]; $month = $input[1]; $day = $input[2]; if (is_numeric($year) && is_numeric($month) && is_numeric($day)) { if (strlen($year) == 4 && strlen($month) == 2 && strlen($day) == 2) { $output = true; } } return $output; } if (date_checker($date, '-')) { echo "The function is working"; }else { echo "The function isNOT working"; } 

检查给定date的最简单方法是使用strtotime将其转换为unixtime,格式化为给定的date格式,然后比较:

function isValidDate($date) { return date('Ym-d', strtotime($date)) === $date; }

当然你可以使用正则expression式来检查有效性,但是它会被限制在给定的格式下,每次你必须编辑它来满足另一种格式时,它也会超出要求。 内置函数是实现工作的最佳方法(在大多数情况下)。

检查下面链接中提供的示例

http://php.net/manual/en/function.checkdate.php/#113205

格式可以根据需要改变