날짜 문자열이 해당 형식의 유효한 날짜인지 확인

API에서 날짜 문자열을 수신했는데 다음과 같이 포맷되어 있습니다.yyyy-mm-dd.

현재 regex를 사용하여 문자열 형식을 검증하고 있습니다.이 형식은 정상적으로 동작하지만 문자열에 따라 올바른 형식이 될 수 있지만 실제로는 유효하지 않은 날짜인 경우가 있습니다.2013-13-01,예를들면.

PHP에서 다음과 같은 문자열을 사용하는 더 좋은 방법이 있습니까?2013-13-01포맷에 유효한 날짜인지 아닌지를 알 수 있습니다.yyyy-mm-dd?



질문에 대한 답변



다음과 같은 목적으로 사용할 수 있습니다.

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 is the time'); 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;