2011-04-28 5 views
3

PHP date_create_from_format 함수는 형식 유효 날짜가 없어도 존재하지 않는 것을 허용합니다.date_create_from_format 입력으로 잘못된 날짜를 허용합니다.

$tmp = date_create_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00", timezone_open('America/Sao_Paulo')); 
var_dump($tmp); 
/* 
output: object(DateTime)#28 (3) { ["date"]=> string(19) "2011-03-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(17) "America/Sao_Paulo" } 
*/ 

이 자동 변환을 피할 수 있습니다 및 함수 반환 -1에서 :이 PHP에서 일어나는 것입니다하지만

[email protected]:~$ date --date="29/02/2011" +%s 
date: invalid date `29/02/2011' 

:

나는 date 명령처럼 행동이 기능을 싶습니다 이 경우 ?

[email protected]:~$ php -v 
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:08:14) 

감사합니다.

답변

0

나는 date_create_from_formatdate_get_last_errors를 호출하면 이미 배열 warningserrors 및 카운터 warning_counterror_count에, 당신에게 구문 분석 문자열에 대한 검증의 모든 종류를 제공 것으로 나타났다.

따라서 경고 및 오류가없는 카운터를 확인하는 것으로 충분합니다. 몇 가지 검사와

개정 코드 :

<? 
$appTZ = 'America/Sao_Paulo'; 

function datetimeCreateErrorsWarnings() { 
    $obj = date_get_last_errors(); 
    return ($obj['error_count'] > 0) || ($obj['warning_count'] > 0); 
} 

function datetimeToUnixTS($data) { 
    global $appTZ; 

    $fmt = "d/m/Y H:i:s"; 

    $dtobj = date_create_from_format($fmt, $data . " 00:00:00", timezone_open($appTZ)); 

    if ($dtobj) { 
     if (!datetimeCreateErrorsWarnings()) { 
      return date_timestamp_get($dtobj); 
     } 
    } 

    //Second try, $data is auto-suficient 
    $dtobj = date_create_from_format($fmt, $data, timezone_open($appTZ)); 

    if ($dtobj) { 
     if (!datetimeCreateErrorsWarnings()) { 
      return date_timestamp_get($dtobj); 
     } 
    } 

    return -1; 
} 

$test = array(
    'asdfasdf', 
    '', 
    "28/02/2011", 
    "29/02/2011", 
    "28/02/2011 00:00:90" 
); 

for ($i=0; $i<count($test); $i++) { 
    $tmp = datetimeToUnixTS($test[$i]); 
    var_dump($tmp); 
    echo "<p>"; 
} 
?> 

위의 스크립트를 생성 한 날짜의 유닉스 타임 스탬프를 계산합니다.

5

date_parse_from_formatcheckdate의 조합을 사용하여 올바른 달력 날짜인지 확인할 수 있습니다.

예 :

$date = date_parse_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00"); 

if (checkdate($date['month'], $date['day'], $date['year'])) { 
    echo "Valid date"; 
} 
else { 
    echo "Invalid date"; 
} 
+0

합니다. 하지만 시간대를 어떻게 파싱합니까? – Niloct

+0

@Niloct : 시간대가 파싱되지 않기 때문에 그렇지 않습니다. 2011 년 2 월 29 일이 시간대에 존재하지 않습니다. ** ** 날짜가 유효한지 확인한 후, 코드에서와 같이 'date_create_from_format'을 시간대와 함께 호출하십시오. – Jon

-1

이 작동합니다 : 내가 볼

$format = 'd/m/Y H:i'; 
    $date = DateTime::createFromFormat($format, Input::get('start_date')); 

    return $date->format('Y/m/d H:i'); 
관련 문제