공휴일/주말 제외 영업일 가져오기 채택완료
해당 코드가 무한루프에 빠지는데 어디가 잘못된건지 모르겟네요..
</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개
잘못된 부분이 여러군데 있습니다
</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 이런식으로 들어갈 것입니다.
나머지는 참고해서 수정해 보세요...
댓글을 작성하려면 로그인이 필요합니다.
방법만 설명 해보겠습니다
주문일 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;
}
}
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인