복붙노트

날짜 문자열이 해당 형식의 유효한 날짜인지 정확하게 판단하십시오.

PHP

날짜 문자열이 해당 형식의 유효한 날짜인지 정확하게 판단하십시오.

API에서 날짜 문자열을 받고 yyyy-mm-dd 형식으로 표시됩니다.

나는 현재 문자열 형식의 유효성을 검사하는 정규식을 사용하고 있습니다. 그러나 문자열에 따라 올바른 형식이 될 수 있지만 실제로는 잘못된 날짜가 될 수 있습니다. 즉 2013-13-01에 게재됩니다.

PHP에서 2013-13-01과 같은 문자열을 취하여 yyyy-mm-dd 형식의 유효한 날짜인지 여부를 알려주는 더 좋은 방법이 있습니까?

해결법

  1. ==============================

    1.이 목적으로 DateTime 클래스를 사용할 수 있습니다.

    이 목적으로 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
    

    데모!

  2. ==============================

    2.문자열이 날짜인지 판단하십시오.

    문자열이 날짜인지 판단하십시오.

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

    3.php prebuilt 함수로 간단한 사용법 :

    php prebuilt 함수로 간단한 사용법 :

    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
    
  4. ==============================

    4.문자열이 비표준 형식 인 경우에도 문자열이 날짜인지 확인합니다.

    문자열이 비표준 형식 인 경우에도 문자열이 날짜인지 확인합니다.

    (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');
    
  5. ==============================

    5.또한 월 날짜를 분석하고 checkdate () 함수를 사용할 수 있습니다.이 함수는 http://php.net/manual/en/function.checkdate.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';
        }
    
  6. ==============================

    6.이 옵션은 단순 할뿐만 아니라 거의 모든 형식을 허용하지만 비표준 형식의 경우 버그가있을 수 있습니다.

    이 옵션은 단순 할뿐만 아니라 거의 모든 형식을 허용하지만 비표준 형식의 경우 버그가있을 수 있습니다.

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

    7.cl-sah의 대답에 조화를 이루지 만,이 소리가 더 좋고 짧습니다 ...

    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
    
  8. ==============================

    8.필자는 PHP를 사용하더라도 기능적 해결책을 찾고 싶다. 예를 들어, @migli가주는 대답은 매우 유연하고 우아합니다.

    필자는 PHP를 사용하더라도 기능적 해결책을 찾고 싶다. 예를 들어, @migli가주는 대답은 매우 유연하고 우아합니다.

    그러나 문제가 있습니다 : 같은 형식으로 많은 DateTime 문자열을 검증해야한다면 어떻게해야할까요? DRY 원리에 어긋나는 형식을 반복해야합니다. 형식을 상수로 지정할 수도 있지만 모든 함수 호출에 상수를 인수로 전달해야합니다.

    그러나 더 이상 두려워하지 마십시오! 우리는 구출에 카레를 사용할 수 있습니다! PHP는 이러한 작업을 즐겁게 만들어주지는 않지만 PHP로 커링을 구현하는 것은 여전히 ​​가능합니다.

    <?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!

  9. ==============================

    9.주어진 날짜가 strtotime을 사용하여 unixtime으로 변환하고 주어진 날짜의 형식으로 포맷 한 다음 비교하는 것이 가장 쉬운 방법입니다.

    주어진 날짜가 strtotime을 사용하여 unixtime으로 변환하고 주어진 날짜의 형식으로 포맷 한 다음 비교하는 것이 가장 쉬운 방법입니다.

    함수 isValidDate ($ date) {     반환 날짜 ( 'Y-m-d', strtotime ($ date)) === $ date; }

    물론 정규 표현식을 사용하여 유효성을 검사 할 수 있지만 다른 형식을 만족시키기 위해 편집해야 할 때마다 지정된 형식으로 제한되며 필요 이상이 될 수도 있습니다. 기본 제공 함수는 작업을 수행하는 가장 좋은 방법입니다 (대부분의 경우).

  10. ==============================

    10.이건 어때?

    이건 어때?

    try-catch 블록을 사용하기 만하면됩니다.

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

    이 방법은 하나의 날짜 / 시간 형식에만 국한되지 않으며 어떤 기능도 정의 할 필요가 없습니다.

  11. ==============================

    11.테스트를 거친 Regex 솔루션 :

    테스트를 거친 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을 반환하고, 그렇지 않으면 날짜를 반환합니다.

  12. ==============================

    12.

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

    13.이것을 시도하십시오 :

    이것을 시도하십시오 :

    $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";
    }
    
  14. ==============================

    14.아말 Murali 대답에 따르면,

    아말 Murali 대답에 따르면,

    $d = DateTime::createFromFormat('Y-m-d g:i:s', $date);
    $d2 = DateTime::createFromFormat('Y-m-d H:i:s', $date);
    
    if(($d && $d->format('Y-m-d g:i:s') == $date) || ($d2 && $d2->format('Y-m-d H:i:s') == $date))
                {
                    return true;
                }
                else 
                {
                    return false;
                }
    
  15. from https://stackoverflow.com/questions/19271381/correctly-determine-if-date-string-is-a-valid-date-in-that-format by cc-by-sa and MIT license