[php] 날짜 문자열이 해당 형식의 유효한 날짜인지 올바르게 판별하십시오.

API에서 날짜 문자열을 받고 있는데 형식이 yyyy-mm-dd입니다.

현재 정규식을 사용하여 문자열 형식의 유효성을 검사하지만 정상적으로 작동하지만 문자열에 따라 올바른 형식 일 수는 있지만 실제로 유효하지 않은 날짜가있는 경우를 볼 수 있습니다. 예 2013-13-01를 들어.

PHP에서 문자열을 가져 와서 2013-13-01형식에 유효한 날짜인지 아닌지 알려주 는 더 좋은 방법이 yyyy-mm-dd있습니까?



답변

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 . 글라 비치가 처음 썼습니다 . ]


테스트 사례 :

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

데모!


답변

문자열이 날짜인지 확인

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]);
}

테스트

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


답변

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

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


답변

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

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


답변

월 날짜와 연도의 날짜를 구문 분석 한 다음 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;
}

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