날짜 문자열이 해당 형식의 유효한 날짜인지 정확하게 판단하십시오.
PHP날짜 문자열이 해당 형식의 유효한 날짜인지 정확하게 판단하십시오.
API에서 날짜 문자열을 받고 yyyy-mm-dd 형식으로 표시됩니다.
나는 현재 문자열 형식의 유효성을 검사하는 정규식을 사용하고 있습니다. 그러나 문자열에 따라 올바른 형식이 될 수 있지만 실제로는 잘못된 날짜가 될 수 있습니다. 즉 2013-13-01에 게재됩니다.
PHP에서 2013-13-01과 같은 문자열을 취하여 yyyy-mm-dd 형식의 유효한 날짜인지 여부를 알려주는 더 좋은 방법이 있습니까?
해결법
-
==============================
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.문자열이 날짜인지 판단하십시오.
문자열이 날짜인지 판단하십시오.
function checkIsAValidDate($myDateString){ return (bool)strtotime($myDateString); }
-
==============================
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.문자열이 비표준 형식 인 경우에도 문자열이 날짜인지 확인합니다.
문자열이 비표준 형식 인 경우에도 문자열이 날짜인지 확인합니다.
(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.또한 월 날짜를 분석하고 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.이 옵션은 단순 할뿐만 아니라 거의 모든 형식을 허용하지만 비표준 형식의 경우 버그가있을 수 있습니다.
이 옵션은 단순 할뿐만 아니라 거의 모든 형식을 허용하지만 비표준 형식의 경우 버그가있을 수 있습니다.
$timestamp = strtotime($date); return $timestamp ? $date : null;
-
==============================
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.필자는 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.주어진 날짜가 strtotime을 사용하여 unixtime으로 변환하고 주어진 날짜의 형식으로 포맷 한 다음 비교하는 것이 가장 쉬운 방법입니다.
주어진 날짜가 strtotime을 사용하여 unixtime으로 변환하고 주어진 날짜의 형식으로 포맷 한 다음 비교하는 것이 가장 쉬운 방법입니다.
함수 isValidDate ($ date) { 반환 날짜 ( 'Y-m-d', strtotime ($ date)) === $ date; }
물론 정규 표현식을 사용하여 유효성을 검사 할 수 있지만 다른 형식을 만족시키기 위해 편집해야 할 때마다 지정된 형식으로 제한되며 필요 이상이 될 수도 있습니다. 기본 제공 함수는 작업을 수행하는 가장 좋은 방법입니다 (대부분의 경우).
-
==============================
10.이건 어때?
이건 어때?
try-catch 블록을 사용하기 만하면됩니다.
$dateTime = 'an invalid datetime'; try { $dateTimeObject = new DateTime($dateTime); } catch (Exception $exc) { echo 'Do something with an invalid DateTime'; }
이 방법은 하나의 날짜 / 시간 형식에만 국한되지 않으며 어떤 기능도 정의 할 필요가 없습니다.
-
==============================
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.
/**** 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.이것을 시도하십시오 :
이것을 시도하십시오 :
$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.아말 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; }
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
'PHP' 카테고리의 다른 글
HTML 콘텐츠에서 스크립트 태그 제거 (0) | 2018.09.18 |
---|---|
문자열에서 줄 바꿈 (문자 없음!)을 제거하는 방법? (0) | 2018.09.18 |
예약 된 작업에서 PHP 파일을 실행하는 방법 (Windows 작업 스케줄러) (0) | 2018.09.18 |
Mcrypt로 파일 암호화 / 암호 해독 (0) | 2018.09.18 |
PHP로 실시간 출력으로 프로세스 실행 (0) | 2018.09.18 |