2011-03-23 4 views
0

나는 내 회사 코드 기반이 건너는데, 난 그냥 단지 기능 MySQL로 연결되지 않는 무언가를 변경하려면 :PHP 버전은()

$sql = "select date_format(str_to_date('$date','$format'),'%Y-%m-%d') startDate "; 
$result = mysql_query($sql); 
... 

우리의 생산 env는 유닉스 환경이기 때문에 dev 환경이기는하지만 어떤 사람들은 Windows 환경에서 코드를 작성하기 때문에 strptime()은 옵션이 아닙니다.

저는 비슷한 질문을 봤지만 내 요구에 맞는 대답은 없었습니다. 변수 형식을 사용하여 문자열에서 날짜를 추출하는 간단하거나 일반적인 방법이 있습니까? 우리는 공급 업체의 파일 이름을 구문 분석하고 있기 때문에 날짜 형식이 너무 많이 다를 수 있습니다

이유는, 그래서 우리가 등 등

+0

정렬 http://stackoverflow.com/questions/2891937/strtotime-doesnt-work-with-dd-mm- yyyy-format – Brad

답변

1

에서 (테스트 스크립트를 작성하지 않고) 그것을 테스트 할 수 있습니다. 자신의 예제 형식에서는 어떤 숫자가 어떤 날짜 증가분인지 알 수있는 방법이 없습니다.

strtotime()의 승인 된 형식을 볼 수 있으며 모든 공급 업체에서 인식하는 형식을 사용하는 경우 운이 좋습니다. 없는 경우에, 최고의 당신이 정말로은 "vendor" => "format"의 조회 테이블을 만드는 것입니다 수 있습니다 그리고 당신은 date_parse_from_format()

편집 사용할 수 있습니다) (아래 주석을 기반으로 *이 여기 date_parse_from_format의 근사치의 PHP4 버전입니다 요구 사항이

function date_parse_from_format($format, $date) { 
    $dMask = array('H'=>'hour','i'=>'minute','s'=>'second','y'=>'year','m'=>'month','d'=>'day'); 
    $format = preg_split('//', $format, -1, PREG_SPLIT_NO_EMPTY); 
    $date = preg_split('//', $date, -1, PREG_SPLIT_NO_EMPTY); 
    foreach ($date as $k => $v) { 
    if ($dMask[$format[$k]]) $dt[$dMask[$format[$k]]] .= $v; 
    } 
    return $dt; 
} 

을 *에 맞게해야 기본적으로 당신은 형식은 날짜 문자열의 각 문자가 무엇을 나타내는 마스크입니다 vendor => format의 조회 테이블이 필요합니다.

참고 : 각 날짜/시간 단위로 사용되는 마스크는 PHP의 일반 date() 문자열 형식에서 사용되는 마스크를 정확하게 반영하지 않습니다. 이것은 단순화되어 있으며 사용자 정의 문자열의 각 개별 문자를가립니다.

예 :

/* 
    lookup table for vendors 
    for EVERY character you want to count as a date/time 
    increment you must use the following masks: 
    hour : H 
    minute : i 
    second : s 
    year : y 
    month : m 
    day : d 
*/ 
$vendorDateFormats = array(
    'vendor1' => 'yyyymmdd', 
    'vendor2' => 'mmddyyyy', 
    'vendor3' => 'ddmmyyyy', 
    'vendor4' => 'yyyy.mm.dd HH:ii:ss' 
); 

// example 1: 
echo "<pre>"; 
print_r(date_parse_from_format($vendorDateFormats['vendor2'],'03232011')); 

// example 2: 
echo "<pre>"; 
print_r(date_parse_from_format($vendorDateFormats['vendor4'],'2011.03.23 12:03:00')); 

출력 : 중복의

Array 
(
    [month] => 03 
    [day] => 23 
    [year] => 2011 
) 

Array 
(
    [year] => 2011 
    [month] => 03 
    [day] => 23 
    [hour] => 12 
    [minute] => 03 
    [second] => 00 
) 
+0

불행하게도 우리는 5.3을 사용하지 않지만 date_parse_from_format()은 정확히 내가 찾고있는 함수 유형입니다. 감사. http://us2.php.net/manual/en/datetime.createfromformat.php 또한 당신이 나를 보내 준 링크 형태로 링크되어 있었는데, 만약 내가 최신 PHP 버전을 가지고 있다면 도움이되었을 것이다. –

+0

아 아. 좋아, 당신을 위해 작동해야하는 php4 버전을 위의 편집을 참조하십시오. –

+0

매우 똑똑합니다. 다시 한번 감사드립니다. –

1

, ddmonyyyy, DDMMYYYY, MMDDYYYY, YYYYMMDD을 처리 할 수 ​​있어야 "다음 목요일"과 같은 시간을 포함하는 대부분의 문자열을 타임 스탬프로 변환하는 PHP 함수 strtotime()PHP Ref이 있지만 유럽과 미국 날짜 구조 ("dd/mm/yyyy"대 " mm/dd/yyyy ").

당신은 짧은 대답은 자동으로 올바르게가 모든 형식을 구문 분석하는 임의의 날짜 형식을 구문 분석 할 수있는 방법이 없다는 것입니다 http://www.functions-online.com/strtotime.html

+0

유럽/미국 날짜 구조가 정확히 strtotime()을 사용할 수없는 이유입니다. 예를 들어, 어떤 날짜가 12112011입니다. –

+0

그러면 문자열을 잘라내어 분석하여 형식을 결정하고 (알려진 형식을 적용하여) 예측 가능한 형식으로 변환 한 다음 구문 분석하는 자체 함수를 만드는 데 어려움을 겪고 있습니다. 또한 체크하기 만하면'strtotime()'이 대시로 구분된다면 유럽 표준을, 슬래시로 구분된다면 미국을 가정 할 것입니다.그게 당신의 문제에 도움이 될지 아닌지는 말해주지 마라. –

+0

아, 그리고 "12112011"과 같은 청크를 분석하는 것은 프로그래밍 방식으로 해결할 수있는 것이 아닙니다. 예상되는 값에 관한 규칙이 없으면 각 가능한 값을 테스트 할 수 있습니다. 이것은 실제로 물건의 입력 끝에서 수정해야하는 것입니다 (입력을 지정된 형식으로 지정해야 함). –