문제

날짜/시간이 유효한지 확인하는 방법이 있습니까? 확인하기 쉽다고 생각할 것입니다.

$date = '0000-00-00';
$time = '00:00:00';
$dateTime = $date . ' ' . $time;

if(strtotime($dateTime)) {
    // why is this valid?
}

정말로 나를 얻는 것은 이것입니다 :

echo date('Y-m-d', strtotime($date)); 

결과 : "1999-11-30",

뭐? 나는 0000-00-00에서 1999-11-30으로 갔습니까 ???

날짜가 그 값 중 하나인지 확인하기 위해 비교를 할 수 있다는 것을 알고 있습니다. 그러나 확인하는 매우 강력한 방법은 아닙니다. 유효한 날짜가 있는지 확인하는 좋은 방법이 있습니까? 누구든지 이것을 확인할 수있는 좋은 기능이 있습니까?

편집 : 사람들이 내가 무엇을 실행하는지 묻는다 : PHP 5.2.5 (CLI) 실행 : Linux Localhost에서 2.6.18-53.1.14.el5 #1 SMP Wed 3 월 5 11 : 36 : 49 EST 2008 I686 I686 I386 GNU/LINUX

도움이 되었습니까?

해결책

에서 php.net

<?php
function isValidDateTime($dateTime)
{
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) {
        if (checkdate($matches[2], $matches[3], $matches[1])) {
            return true;
        }
    }

    return false;
}
?>

다른 팁

여기에 언급했듯이 : https://bugs.php.net/bug.php?id=45647

여기에는 버그가 없습니다. 00-00-00은 1999-12-00 인 1999-11-30 인 2000-00-00을 의미합니다. 버그가없고 완벽하게 정상입니다.

그리고 몇 가지 테스트에서 볼 수 있듯이 약간의 불안한 경우 뒤로 굴리는 행동이 예상됩니다.

>> date('Y-m-d', strtotime('2012-03-00'))
string: '2012-02-29'
>> date('Y-m-d', strtotime('2012-02-00'))
string: '2012-01-31'
>> date('Y-m-d', strtotime('2012-01-00'))
string: '2011-12-31'
>> date('Y-m-d', strtotime('2012-00-00'))
string: '2011-11-30'

echo 날짜 ( 'ym-d', strtotime ($ date));

결과 : "1999-11-30"

결과 strtotime IS 943920000- 이것은 대략 몇 초입니다. 유닉스 에포크 (기준은 측정됩니다)까지 1999-11-30까지.

이있다 문서화 MySQL 버그 ~에 mktime(), localtime(), strtotime() 사전 에포 시간을 시도 할 때이 홀수 값을 반환합니다 ( "0000-00-00 00:00:00:00"포함). 이것이 실제로 버그인지에 대한 연결된 스레드에 대한 논쟁이 있습니다.

타임 스탬프가 1970 년부터 시작된 이래 어쨌든 그것이 작동해야한다고 생각하지 않습니다.

아래는 "0000-00-00 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 :

/**
 * Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates
 */
function convert_date_string($date_string)
{
    list($date, $time) = explode(" ", $date_string);
    list($hours, $minutes, $seconds) = explode(":", $time);
    list($year, $month, $day) = explode("-", $date);
    return mktime($hours, $minutes, $seconds, $month, $day, $year);
}

범위를 벗어 났을 때 일관된 결과를 기대하지 마십시오.

cf strtotime

cf GNU 캘린더 데이트 항목.html

"숫자 몇 개월 동안 ISO 8601 형식 '연도'형식이 허용되는데,이 연도는 긍정적 인 숫자입니다. 달은 01에서 12 사이의 숫자입니다, 그리고 하루는 01에서 31 사이의 숫자입니다. 숫자가 10 미만인 경우 주요 0이 있어야합니다. "

따라서 '0000-00-00'은 이상한 결과를 제공합니다. 그것은 논리적입니다!


"또한 모든 플랫폼이 부정적인 타임 스탬프를 지원하는 것은 아니므로 날짜 범위는 Unix Epoch보다 일찍 제한 될 수 있습니다.. 이것은 eg %e, %t, %r 및 %d (더 많을 수 있음)를 의미하며 1970 년 1 월 1 일 이전 날짜는 Windows, 일부 Linux 배포 및 기타 운영 체제에서 작동하지 않습니다.."

cf 스트프 프리 타임


사용 점검 대신 기능 (더 강력한) :

달 : 달은 1에서 12 사이입니다.

날 : 하루는 주어진 달의 허용 일 수에 달합니다. 도약 연도를 고려합니다.

연도 : 연도는 1에서 32767 사이입니다.

이 버전을 사용하면 필드가 비어 있고 MM/DD/YY 또는 MM/DD/YYYY 형식의 날짜가 있고 단일 자리 시간을 허용하며 선택 사항 AM/PM을 추가하며 시간 일치시 미묘한 결함을 수정합니다.

여전히 '23 : 14 am '과 같은 병리학 적 시대를 허용합니다.

function isValidDateTime($dateTime) {
    if (trim($dateTime) == '') {
        return true;
    }
    if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) {
        list($all,$mm,$dd,$year) = $matches;
        if ($year <= 99) {
            $year += 2000;
        }
        return checkdate($mm, $dd, $year);
    }
    return false;
}

MySQL 날짜 필드의 시간없이 날짜 변환을 처리하려면이 훌륭한 코드를 수정할 수 있습니다. 이 기능을 수행하지 않고 내 버전의 PHP에서는 매번 "0000-00-00"을 얻습니다. 성가신.

function ConvertDateString ($DateString)
{
    list($year, $month, $day) = explode("-", $DateString);
    return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year));
}
<?php
function is_valid_date($user_date=false, $valid_date = "1900-01-01") {
    $user_date = date("Y-m-d H:i:s",strtotime($user_date));
    return strtotime($user_date) >= strtotime($valid_date) ? true : false;
}

echo is_valid_date("00-00-00") ? 1 : 0;    // return 0

echo is_valid_date("3/5/2011") ? 1 : 0;    // return 1

위의 Martin 답변을 변경해 왔는데, 이는 모든 유형의 날짜를 검증하고 원하는 형식으로 반환합니다.

스크립트 스트프 프트 타임 아래 줄을 편집하여 형식을 변경하면 ( "10-10-2012", strtotime ($ dt));

<?php
echo is_date("13/04/10");

function is_date( $str ) {
    $flag = strpos($str, '/');

    if(intval($flag)<=0){
        $stamp = strtotime( $str );
    } else {
        list($d, $m, $y) = explode('/', $str);    
        $stamp = strtotime("$d-$m-$y");
    } 
    //var_dump($stamp) ;

    if (!is_numeric($stamp)) {
        //echo "ho" ;
        return "not a date" ;        
    }

    $month = date( 'n', $stamp ); // use n to get date in correct format
    $day   = date( 'd', $stamp );
    $year  = date( 'Y', $stamp );

    if (checkdate($month, $day, $year)) {
        $dt = "$year-$month-$day" ;
        return strftime("%d-%b-%Y", strtotime($dt));
        //return TRUE;
    } else {
        return "not a date" ;
    }
}
?>

EXTJS 응용 프로그램에서 오는 날짜를 검증하기 위해 다음 코드를 사용했습니다.

function check_sql_date_format($date) {
    $date = substr($date, 0, 10);
    list($year, $month, $day) = explode('-', $date);
    if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) {
        return false;
    }
    return checkdate($month, $day, $year);
}
<?php

function is_date( $str ) {
    $stamp = strtotime( $str );

    if (!is_numeric($stamp)) {
        return FALSE;
    }
    $month = date( 'm', $stamp );
    $day   = date( 'd', $stamp );
    $year  = date( 'Y', $stamp );

    if (checkdate($month, $day, $year)) {
        return TRUE;
    }
    return FALSE;
}
?>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top