Answers:
您可以DateTime
为此目的使用类:
function validateDate($date, $format = 'Y-m-d')
{
$d = DateTime::createFromFormat($format, $date);
// The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
return $d && $d->format($format) === $date;
}
[ 功能取自这个答案。也在php.net上。最初由Glavić撰写。]
测试用例:
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
var_dump(validateDate('2012', 'Y')); // true
var_dump(validateDate('12012', 'Y')); // false
strtotime
先获取Unix时间戳,然后date('Y-m-d', $t)
获取字符串日期。然后,您可以像此答案一样比较它们。
strtotime
,但是对于strtotime
无法识别的非标准格式,您将需要其他解决方案。对于php版本5.2的支持在2011年1月停止,对于5.3版本的支持在2014
var_dump( validateDate('2012-2-9'));
'Y-n-j'
@reignsly。
$d
您输入的日期不会是错误的,该日期已溢出部分,例如第13个月(2013-13-01)。但这确实取决于您想要什么。例如validateDate('2015-55-66')
,如果您需要有效,则可以,只需检查是否$d
为对象。
确定是否有任何字符串是日期
function checkIsAValidDate($myDateString){
return (bool)strtotime($myDateString);
}
yyyy-mm-dd
。
2015-02-30
视为有效日期,因为当给定的日期大于给定月份(或负数)的天数时,php会滚动到下个月。由于日期被保证为格式,yyyy-mm-dd
因此可以通过将return更改为来固定日期return (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
。
(bool)strtotime('s')
如此真实?
$myDateString = str_replace("/", '-', $myDateString);
如果日期字符串包含斜杠(/),例如:
与php预建函数一起简单使用:
function checkmydate($date) {
$tempDate = explode('-', $date);
// checkdate(month, day, year)
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
测试
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false
if
可以简单地返回true
或false
,然后返回测试本身。
return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
2
,20
,202
,2020
或者即使今年是20201
-它的每一次返回true。
确定字符串是否为日期,即使字符串为非标准格式
(strtotime不接受任何自定义格式)
<?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', 'Y-m-d H:i:s');
validateDateTime('2001-03-10', 'Y-m-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', 'm.d.y');
validateDateTime('10, 3, 2001', 'j, n, Y');
validateDateTime('20010310', 'Ymd');
validateDateTime('05-16-18, 10-03-01', 'h-i-s, j-m-y');
validateDateTime('Monday 8th of August 2005 03:12:46 PM', 'l jS \of F Y h:i:s A');
validateDateTime('Wed, 25 Sep 2013 15:28:57', 'D, d M Y H: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', 'Y-m-D H:i:s');
validateDateTime('2001', 'm');
validateDateTime('Mon', 'D-m-y');
validateDateTime('Mon', 'D-m-y');
validateDateTime('2001-13-04', 'Y-m-d');
if
简单地返回true
或false
,然后返回测试本身。
此选项不仅简单,而且几乎可以接受任何格式,尽管使用非标准格式可能会出现问题。
$timestamp = strtotime($date);
return $timestamp ? $date : null;
202
返回负数-仍通过测试。
您还可以解析月份日期和年份的日期,然后可以使用checkdate()
可以在此处阅读的PHP函数: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';
}
检查给定日期是否有效的最简单方法可能是使用将其转换为unixtime strtotime
,将其格式化为给定日期的格式,然后进行比较:
function isValidDate($date) {
return date('Y-m-d', strtotime($date)) === $date;
}
当然,您可以使用正则表达式来检查有效性,但是它将限于给定的格式,每次您必须对其进行编辑以满足其他格式时,它也会超出要求。内置功能是完成工作的最佳方法(在大多数情况下)。
checkdate()
-但我发现如果年份为ANY值,则checkdate失败:2, 20, 202, 2020, 20201
-全部返回true。我要解决您的问题!
根据cl-sah的回答,但这听起来更好,更短...
function checkmydate($date) {
$tempDate = explode('-', $date);
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
测试
checkmydate('2015-12-01');//true
checkmydate('2015-14-04');//false
count($tempDate) === 3
虽然
我有一个东西,即使使用PHP,我也喜欢找到功能解决方案。因此,例如,@ migli给出的答案确实是一个很好的答案,高度灵活且优雅。
但这有一个问题:如果您需要验证许多相同格式的DateTime字符串怎么办?您将不得不在各处重复格式,这与DRY原理背道而驰。我们可以将格式放入常量中,但是仍然必须将常量作为参数传递给每个函数调用。
但是别再害怕了!我们可以用咖喱角来营救!PHP并没有使这项任务令人愉快,但是仍然可以使用PHP实现currying:
<?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
功能编程FTW!
恐怕多数投票解决方案(https://stackoverflow.com/a/19271434/3283279)无法正常工作。第四个测试用例(var_dump(validateDate('2012-2-25')); //否)错误。日期是正确的,因为它与格式相对应-m允许一个月,带或不带前导零(请参阅:http : //php.net/manual/en/datetime.createfromformat.php)。因此,日期2012-2-25的格式为Ymd,并且测试用例必须为true而不是false。
我相信更好的解决方案是按如下方式测试可能的错误:
function validateDate($date, $format = 'Y-m-d') {
DateTime::createFromFormat($format, $date);
$errors = DateTime::getLastErrors();
return $errors['warning_count'] === 0 && $errors['error_count'] === 0;
}
这个怎么样?
我们只使用try-catch块。
$dateTime = 'an invalid datetime';
try {
$dateTimeObject = new DateTime($dateTime);
} catch (Exception $exc) {
echo 'Do something with an invalid DateTime';
}
这种方法不仅限于一种日期/时间格式,您不需要定义任何函数。
'0000-00-00 00:00:00'
是有效的日期时间值。这只是第一个价值。但是,datetime对象的date属性将为'-0001-11-30 00:00:00'
。
经过测试的Regex解决方案:
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;
}
如果日期无效或不是yyyy-mm-dd格式,则返回null,否则将返回日期。
使用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
}
/*********************************************************************************
Returns TRUE if the input parameter is a valid date string in "YYYY-MM-DD" format (aka "MySQL date format")
The date separator can be only the '-' character.
*********************************************************************************/
function isMysqlDate($yyyymmdd)
{
return checkdate(substr($yyyymmdd, 5, 2), substr($yyyymmdd, 8), substr($yyyymmdd, 0, 4))
&& (substr($yyyymmdd, 4, 1) === '-')
&& (substr($yyyymmdd, 7, 1) === '-');
}
/**** 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);
}
}
试试看:
$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";
}