테스트 사이트 - 개발 중인 베타 버전입니다

공휴일/주말 제외 영업일 가져오기 채택완료

웹프리죤 1년 전 조회 3,771

해당 코드가 무한루프에 빠지는데 어디가 잘못된건지 모르겟네요..

 

</p>

<p>function getHoliday($year,$month) {

    $key = "XU8GUYrybv3+tqa5aaDaJ8DTDzQQXiWTUxG6kR+RBCpBaMCNhXmeBZGlPhCgfEWqf1BlFVursc6Shospm6wkFw=="; 

    $param = 'ServiceKey='.$key;

    $param .= '&solYear='.$year;

    if($month > "") { $param .= '&solMonth='.sprintf("%02d",$month); }

    $param .= '&numOfRows=9999';</p>

<p>    $reqUrl = "<a href="http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?".$param;" target="_blank" rel="noopener noreferrer">http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?".$param;</a></p>

<p>    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $reqUrl);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    curl_setopt($ch, CURLOPT_HEADER, FALSE);

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

    $response = curl_exec($ch);

    curl_close($ch);</p>

<p>    $xml = simplexml_load_string($response);

    $json = json_encode($xml);

    $data = json_decode($json,true);</p>

<p>    return $data;

}</p>

<p>$currentYear = date('Y');

$data = getHoliday($currentYear,"");

foreach($data['body']['items'] as $items) {

    foreach($items as $item) {

        echo "locdate: ". $item['locdate']. ", dateName: ". $item['dateName']. "
";

        #활용할 코드 작성

    }

}</p>

<p>// 날짜 간격 - 주말,특정일 제외

function calcDayOffDate($date, $diff, $holidayAry="") { 

    $sign = $diff < 0 ? "-" : "+";</p>

<p>    do { 

        $date = date("Y-m-d", strtotime("{$sign}1 days", strtotime($date))); 

        if ((date("w", strtotime($date)) != 0 && date("w", strtotime($date)) != 6) && !in_array($date, $holidayAry) ) { 

            $diff = $sign === "-" ? $diff + 1 : $diff - 1;

        } 

    } while ($diff != 0); </p>

<p>    return $date; 

}</p>

<p>$holiday = array();

foreach($result as $row) {

    array_push($holiday, date("Y-m-d", strtotime($row['locdate'])));

}

$predictionDate = calcDayOffDate(date("Y-m-d H:i:s"), $predictionDays, $holiday);</p>

<p>

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트

잘못된 부분이 여러군데 있습니다

</p>

<p>function getHoliday($year, $month) {

    $key = "XU8GUYrybv3+tqa5aaDaJ8DTDzQQXiWTUxG6kR+RBCpBaMCNhXmeBZGlPhCgfEWqf1BlFVursc6Shospm6wkFw=="; 

    $param = 'ServiceKey=' . $key;

    $param .= '&solYear=' . $year;

    if ($month != "") { 

        $param .= '&solMonth=' . sprintf("%02d", $month); 

    }

    $param .= '&numOfRows=9999';

    $reqUrl = "<a href="https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?"" target="_blank" rel="noopener noreferrer">https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?"</a> . $param;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $reqUrl);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    curl_setopt($ch, CURLOPT_HEADER, FALSE);

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

    $response = curl_exec($ch);

    curl_close($ch);

    $xml = simplexml_load_string($response);

    $json = json_encode($xml);

    $datas = json_decode($json, true);

    return $datas;

}</p>

<p>$currentYear = date('Y');

$data = getHoliday($currentYear, "");</p>

<p>$holiday = array();

foreach ($data['body']['items']['item'] as $item) {

    echo $item['locdate'].'
';

    $holiday[] = date("Y-m-d", strtotime($item['locdate']));

}</p>

<p>


이렇게 하면 아래와 같이 데이타를 가져옵니다.
20240101
20240209
20240210
20240211
20240212
20240301
20240410
20240505
20240506
20240515
20240606
20240815
20240916
20240917
20240918
20241003
20241009
20241225

$holiday 에서는 0000-00-00 이런식으로 들어갈 것입니다.

 

나머지는 참고해서 수정해 보세요...

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

1년 전

방법만 설명 해보겠습니다

주문일 3일 이상 되면 취소 시키기

1. api에서 한번만 읽어오게 만든다

처음  공휴일 데이터를 읽어와서 holi2024.txt화일을 생성하고 공휴일 날짜 기록

이후 부터는 위 화일이  존재하면 이 화일을 읽어서 날짜를 배열로 만든다

$holiarray=file("holi2024.txt");

또는 휴일을 하나의 문자열로 만들어 저장하고 explode사용하여 배열을 만든다

 

$currentYear = date('Y');      

$file="holi".$currentYear.".txt";
if(! file_exists($file)){ }

 

2. 현재날짜 부터 -1day  해서 휴일 배열에 없는 날짜이면 $daycnt++;

$daycnt가 3이  될때까지 반복 loop

3 이되면 이 날짜보다 작은 날짜는 취소 하는 코드, loop종료

 

3.하루에 한번만 코드를 실행하도록 만들어야함

 

$today=date("Y-m-d");

for($i=1;$i<15;$i++){

 $sdate = date("Ymd", strtotime("$today -{$i} days"));

$weekd = date("w", strtotime($sdate));

if(in_array($sdate, $holiarray) || $weekd ==0 || $weekd ==6) continue;

$daycnt++;

if($daycnt > 3){

 sql_query( ); //  $sdate 이하 날짜전체  취소 쿼리

//하루에 한번만실행하게 해주는 쿼리 추가 cf_1 사용

break;

}

}

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인