공휴일/주말 제외 영업일 가져오기
본문
해당 코드가 무한루프에 빠지는데 어디가 잘못된건지 모르겟네요..
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;
}
}