날짜 문자열이 해당 형식의 유효한 날짜인지 확인
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 \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;
지정된 날짜가 유효한지 여부를 확인하는 가장 쉬운 방법은 아마도 를 사용하여 날짜를 고유 시간으로 변환하는 것입니다.strtotime
지정된 날짜 형식으로 포맷한 후 비교합니다.
function isValidDate($date) {
return date('Y-m-d', strtotime($date)) === $date;
}
물론 정규 표현식을 사용하여 유효성을 확인할 수 있지만, 다른 형식을 만족시키기 위해 편집할 때마다 지정된 형식으로 제한됩니다.또한 필요 이상으로 커집니다.임베디드 기능은 (대부분의 경우) 작업을 수행하는 가장 좋은 방법입니다.
월일과 연도의 날짜를 해석하여 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';
}
대부분의 투표 솔루션(https://stackoverflow.com/a/19271434/3283279)이 제대로 작동하지 않습니다.네 번째 테스트 케이스(var_dump(validateDate('2012-2-25'), // false)가 잘못되었습니다.날짜는 올바른 형식입니다.m은 선행 0이 있는 달 또는 없는 달을 허용합니다(http://php.net/manual/en/datetime.createfromformat.php) 참조).따라서 날짜 2012-2-25는 Y-m-d 형식이며 테스트 사례는 거짓이 아니라 참이어야 합니다.
나는 다음과 같이 가능한 오류를 테스트하는 것이 더 나은 해결책이라고 생각한다.
function validateDate($date, $format = 'Y-m-d') {
DateTime::createFromFormat($format, $date);
$errors = DateTime::getLastErrors();
return $errors['warning_count'] === 0 && $errors['error_count'] === 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
저는 PHP를 사용하더라도 기능적인 솔루션을 찾는 것을 좋아합니다.예를 들어 @migli의 답변은 매우 유연하고 우아합니다.
하지만 문제가 있습니다. 동일한 형식의 많은 Date Time 문자열을 검증해야 하는 경우 어떻게 해야 합니까?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!
이것은 어떠세요?
우리는 단순히 트라이캐치블록을 사용한다.
$dateTime = 'an invalid datetime';
try {
$dateTimeObject = new DateTime($dateTime);
} catch (Exception $exc) {
echo 'Do something with an invalid DateTime';
}
이 접근 방식은 하나의 날짜/시간 형식에만 국한되지 않으며 함수를 정의할 필요가 없습니다.
확인 날짜 함수로 확인:
$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
}
테스트 완료 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;
}
날짜가 유효하지 않거나 yyy-mm-dd 형식이 아닌 경우 null을 반환하고 그렇지 않은 경우 날짜를 반환합니다.
/*********************************************************************************
Returns TRUE if the input parameter is a valid date string in "YYYY-MM-DD" format (aka "MySQL date format")
The date separator can be only the '-' character.
*********************************************************************************/
function isMysqlDate($yyyymmdd)
{
return checkdate(substr($yyyymmdd, 5, 2), substr($yyyymmdd, 8), substr($yyyymmdd, 0, 4))
&& (substr($yyyymmdd, 4, 1) === '-')
&& (substr($yyyymmdd, 7, 1) === '-');
}
답변에 가 "Date Time"인지 또는 더할 수 .instanceof
DateTime
.
$date = DateTime::createFromFormat('Ymd', $value);
$is_datetime = ($date instanceof DateTime);
$is_valid_datetime_format = $is_datetime
? ($date->format('Ymd') === $value)
: false;
if (!$is_datetime || !$is_valid_datetime_format) {
// Not a valid date.
return false;
}
것, 이, 이, 이, 이가 값이 모두 잡히지 않는 .DateTime
랜덤 문자열이나 예: " " " " )가 됩니다.20202020
.
/**** 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);
}
}
내게 효과가 있다는 걸 알려 줘
$date = \DateTime::createFromFormat('d/m/Y', $dataRowValue);
if (!empty($date)) {
//Your logic
}else{
//Error
}
알파벳 또는 알파벳 숫자를 전달하면 빈 값이 반환됩니다.
정규식 솔루션
function verify_date($date){
/* correct format = "2012-09-15 11:23:32" or "2012-09-15"*/
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])( (0[0-9]|[1-2][0-4]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]))?$/",$date)) {
return true;
} else {
die("Wrong date format: it should be '2012-09-15 11:23:32' or '2012-09-15', date received is: ".$date);
}
}
시험해 보세요.
$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";
}
언급URL : https://stackoverflow.com/questions/19271381/correctly-determine-if-date-string-is-a-valid-date-in-that-format
'source' 카테고리의 다른 글
Balley 및 HttpEntity를 사용하지 않는 POST 멀티파트 요구 작업 (0) | 2022.11.19 |
---|---|
Laravel 5.1에서 Laravel 5.8로 업그레이드한 후 whereHas()가 느려짐 (0) | 2022.11.19 |
풀 URL 사용 시 PHP file_get_contents가 매우 느리다 (0) | 2022.11.19 |
휴지 상태 주석 - 필드 액세스와 속성 액세스 중 어느 쪽이 더 좋습니까? (0) | 2022.11.19 |
javascript(또는 jQuery) 사용 후 :: before 및 :: 등의 CSS 유사 요소 선택 및 조작 (0) | 2022.11.18 |