공휴일/주말 제외 영업일 가져오기

공휴일/주말 제외 영업일 가져오기

QA

공휴일/주말 제외 영업일 가져오기

답변 2

본문

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

 


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 = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?".$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);
    $data = json_decode($json,true);
    return $data;
}
$currentYear = date('Y');
$data = getHoliday($currentYear,"");
foreach($data['body']['items'] as $items) {
    foreach($items as $item) {
        echo "locdate: ". $item['locdate']. ", dateName: ". $item['dateName']. "<br>";
        #활용할 코드 작성
    }
}
// 날짜 간격 - 주말,특정일 제외
function calcDayOffDate($date, $diff, $holidayAry="") { 
    $sign = $diff < 0 ? "-" : "+";
    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); 
    return $date; 
}
$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);

이 질문에 댓글 쓰기 :

답변 2

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

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 = "https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?" . $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;
}
$currentYear = date('Y');
$data = getHoliday($currentYear, "");
$holiday = array();
foreach ($data['body']['items']['item'] as $item) {
    echo $item['locdate'].'<br>';
    $holiday[] = date("Y-m-d", strtotime($item['locdate']));
}


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

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

 

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

방법만 설명 해보겠습니다

주문일 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;

}

}

 

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 26
© SIRSOFT
현재 페이지 제일 처음으로