Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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
Php 正确确定日期字符串是否为该格式的有效日期_Php_Date_Datetime - Fatal编程技术网

Php 正确确定日期字符串是否为该格式的有效日期

Php 正确确定日期字符串是否为该格式的有效日期,php,date,datetime,Php,Date,Datetime,我从API接收到一个日期字符串,它的格式为yyyy-mm-dd 我目前正在使用一个正则表达式来验证字符串格式,它可以正常工作,但我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。i、 例如,e.2013-13-01 在PHP中,有没有更好的方法来获取字符串,例如2013-13-01,并判断它是否是格式yyy-mm-dd的有效日期?您可以用于此目的: 函数validateDate($date,$format='Y-m-d') { $d=DateTime::createFro

我从API接收到一个日期字符串,它的格式为
yyyy-mm-dd

我目前正在使用一个正则表达式来验证字符串格式,它可以正常工作,但我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。i、 例如,e.
2013-13-01

在PHP中,有没有更好的方法来获取字符串,例如
2013-13-01
,并判断它是否是格式
yyy-mm-dd
的有效日期?

您可以用于此目的:

函数validateDate($date,$format='Y-m-d')
{
$d=DateTime::createFromFormat($format,$date);
//对于任何位数的整数,Y(4位数年份)返回TRUE,因此将比较从==更改为===可以解决问题。
返回$d&&$d->format($format)===$date;
}
[函数取自。也是在。最初由编写人编写。]


测试用例:

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

您可以为此目的使用:

函数validateDate($date,$format='Y-m-d')
{
$d=DateTime::createFromFormat($format,$date);
//对于任何位数的整数,Y(4位数年份)返回TRUE,因此将比较从==更改为===可以解决问题。
返回$d&&$d->format($format)===$date;
}
[函数取自。也是在。最初由编写人编写。]


测试用例:

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

您还可以解析月份日期和年份的日期,然后可以使用PHP函数
checkdate()
,您可以在此处阅读:

你也可以试试这个:

$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函数
checkdate()
,您可以在此处阅读:

你也可以试试这个:

$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';
    }

确定任何字符串是否为日期

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

确定任何字符串是否为日期

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

以简单的方式使用php预构建函数:

function checkmydate($date) {
  $tempDate = explode('-', $date);
  // checkdate(month, day, year)
  return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
$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
}
测试

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

以简单的方式使用php预构建函数:

function checkmydate($date) {
  $tempDate = explode('-', $date);
  // checkdate(month, day, year)
  return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
$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
}
测试

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

此选项不仅简单,而且几乎可以接受任何格式,尽管对于非标准格式,它可能有缺陷

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

此选项不仅简单,而且几乎可以接受任何格式,尽管对于非标准格式,它可能有缺陷

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

与cl sah的答案一致,但这听起来更好,更短

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


与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
(strotime不接受任何自定义格式)


确定字符串是否为日期,即使字符串是非标准格式

   checkmydate('2015-12-01'); //true
   checkmydate('2015-14-04'); //false
(strotime不接受任何自定义格式)


即使使用PHP,我也喜欢找到功能性的解决方案。例如,@migli给出的答案非常好,非常灵活和优雅

但它有一个问题:如果需要验证许多具有相同格式的日期时间字符串,该怎么办?你必须在所有地方重复这种格式,这与DRY原则背道而驰。我们可以将格式放在常量中,但仍然必须将常量作为参数传递给每个函数调用

但是不要再害怕了!我们可以用咖喱来拯救我们!PHP并不能使这项任务令人愉快,但仍然可以使用PHP实现Curry:

<?php
function validateDateTime($format)
{
    return function($dateStr) use ($format) {
        $date = DateTime::createFromFormat($format, $dateStr);
        return $date && $date->format($format) === $dateStr;
    };
}
是的,没什么区别。。。但真正的力量来自于部分应用的功能,通过以下方式实现:

// 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我有一个东西,即使使用PHP,我也喜欢找到功能性的解决方案。例如,@migli给出的答案非常好,非常灵活和优雅

但它有一个问题:如果需要验证许多具有相同格式的日期时间字符串,该怎么办?你必须在所有地方重复这种格式,这与DRY原则背道而驰。我们可以将格式放在常量中,但仍然必须将常量作为参数传递给每个函数调用

但是不要再害怕了!我们可以用咖喱来拯救我们!PHP并不能使这项任务令人愉快,但仍然可以使用PHP实现Curry:

<?php
function validateDateTime($format)
{
    return function($dateStr) use ($format) {
        $date = DateTime::createFromFormat($format, $dateStr);
        return $date && $date->format($format) === $dateStr;
    };
}
是的,没什么区别。。。但真正的力量来自于部分应用的功能,通过以下方式实现:

// 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经测试的正则表达式解决方案:

    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,否则返回日期。

测试正则表达式解决方案:

    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,否则将返回日期。

检查给定日期是否有效的最简单方法可能是使用
strotime
将其转换为unixtime,将其格式化为给定日期的格式,然后进行比较:

函数isValidDate($date){
返回日期('Y-m-d',strotime($date))==$date;
}


当然,您可以使用正则表达式来检查有效性,但它仅限于给定的格式,每次您都必须对其进行编辑以满足其他格式的要求,而且它将超出要求。内置函数是实现作业的最佳方式(在大多数情况下)。

检查给定日期是否有效的最简单方式可能是使用strotime将其转换为unixtime,将其格式化为给定日期的格式,然后进行比较:

    /**** 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);
        }

    }
函数isValidDate($date){
返回日期('Y-m-d',strotime($date))==$date;
}

当然,您可以使用正则表达式来检查有效性,但它仅限于给定的格式,每次您都必须对其进行编辑以满足其他格式的要求,而且它将超出要求。内置函数是最好的