[과연 이런게 필요한가?] 날짜, 요일, 총 몇회인지 확인하는 함수 > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

[과연 이런게 필요한가?] 날짜, 요일, 총 몇회인지 확인하는 함수 정보

[과연 이런게 필요한가?] 날짜, 요일, 총 몇회인지 확인하는 함수

본문

이번에 프로젝트 하면서 제일 하기 귀차니즘에 시달렸던 부분이며 -_-;

차후 사용이 거의 없을거란 생각에.. 혹시나 사용하실분이 계시면

사용하시라고 적어 놓고 갑니다.

설명
- 두가지의 함수가 있습니다.
- 1. 시작날짜, 횟수, 요일
- 2. 시작날짜, 마지막날짜, 요일

1번은 시작날짜횟수, 요일을 넣으므로 해서 시작날짜부터 시작되어 요일에 해당되는
횟수만큼 센후 마지막날짜를 구해줍니다.
예) 시작날짜 2009년 3월 1일(일요일), 횟수 5회, 요일: 월, 수, 금을 입력하면
마지막 3월2일(월) -> 3월 4일(수) -> 3월 6일(금) -> 3월 9일(월) ->3월 11일(수)가 되어
20090311 값을 리턴해줍니다.

2번은 1번과 비슷하나 반대로 시작날짜, 끝날짜, 요일을 입력하면 해당하는 횟수가 출력됩니다.
예) 1번 예와 동일한 조건에 횟수를 제외하고 끝날짜 20090311을 입력하면
5라는 횟수값이 리턴됩니다.

사용 방법

######## 마지막 날짜 구하기 #######
$ymd = "20090301";
$num = "5";
$day = "1|3|5";
day_e_day($ymd , $num, $day) ;
-> 리턴값 20090311

######## 마지막 날짜 구하기 #######
$fymd = "20090301";
$eymd = "20090311";
$day = "1|3|5";
day_fe_day($fymd , $eymd, $day);
-> 리턴값 5


요일의 구분자는 "|" 이며
1-월요일
2-화요일
3-수요일
4-목요일
5-금요일
6-토요일
7-일요일
8-토요일,일요일(2개로 변환됨)

1. 마지막 날짜 구하기


// 시작날짜, 총 횟수, 적용 요일
// 해당 입력받은 내용을 마지막날짜를 구하는 함수
function day_e_day($f_ymd , $num, $day){

$day = explode("|",$day);
$day_cnt = count($day);

for($i=0;$i<$day_cnt;$i++){
if($day[$i] == 7)
$day[$i] = "0";

if($day[$i] == 8){
unset($day[$i]);
array_push($day, "+0");
array_push($day, "6");
}

if($day[$i] > 8)
alert("선택한 요일이 잘못된 값입니다.");
}

$day = trim_array($day);
$day_cnt = count($day);

$f_y = substr($f_ymd,0,4);
$f_m = substr($f_ymd,4,2);
$f_d = substr($f_ymd,6,2);
// 해당 날짜를 time형식으로 변경
$f_time = mktime(0,0,0,$f_m,$f_d,$f_y);

// 해당 요일을 숫자로 기록
$f_w = date("w",$f_time);

// 두번째주 일요일의 time을 구함
$f_next_time = mktime(0,0,0,$f_m,$f_d+(7-$f_w),$f_y);

// 시작주의 포함된 횟수 구하기
$f_weeknum_cnt = 0;
for($i=6;$i>=$f_w;$i--){
if(in_array($i,$day))
$f_weeknum_cnt++;
}

// 첫번째 주의 횟수를 제외한 총 횟수
$num = $num-$f_weeknum_cnt;

// 정확한 주를 계산하기 위하여 나머지 횟수 구하기
$num_rem = $num%$day_cnt;

// 총 횟수에 나머지 횟수을 뺀후 일주일 수업횟수를 나눠 몇주인지 계산
$num_week = ($num-$num_rem)/$day_cnt;

// 총 몇주인지 계산후 일수로 변환하기 위해 7을 곱함
$num_week_day = $num_week*7;

// 마지막주가 있을경우
// 몇일이 추가 되는지 계산
if($num_rem != 0){
$day_max_num = 0;
for($i=0; $i<$num_rem;$i++){
if($day_max_num < $day[$i]){
$day_max_num = $day[$i];
}
}

if(in_array("0",$day) && $day_max_num == 0){
$day_max_num = 1;
}else{
$day_max_num += 1;
}
}else{
$day_max_num = 0;
for($i=0; $i<$day_cnt;$i++){
if($day_max_num < $day[$i]){
$day_max_num = $day[$i];
}
}
$day_max_num = $day_max_num-6;
}

$sum_day_time = mktime(0,0,0,1,1+($num_week_day+$day_max_num),1970);
//($num_week_day+$day_max_num)*24*60*60;

$end_day_time = $f_next_time+$sum_day_time;

$end_day = date("Ymd",$end_day_time);

return trim($end_day);
}


2. 횟수 구하기



// 시작, 마지막날, 적용 요일 에 대한 총 횟수를 구한다.
// date_fe_num("20090101","20091230","1|2|3")
function day_fe_num($f_ymd, $e_ymd, $day){
if($f_ymd >= $e_ymd)
alert("시작날이 마지막날보다 큽니다.");

$day = explode("|",$day);
$day_cnt = count($day);

for($i=0;$i<$day_cnt;$i++){
if($day[$i] == 7)
$day[$i] = "0";

if($day[$i] == 8){
unset($day[$i]);
array_push($day, "+0");
array_push($day, "6");
}

if($day[$i] > 8)
alert("선택한 요일이 잘못된 값입니다.");
}

$day = trim_array($day);
$day_cnt = count($day);

$f_y = substr($f_ymd,0,4);
$f_m = substr($f_ymd,4,2);
$f_d = substr($f_ymd,6,2);
$e_y = substr($e_ymd,0,4);
$e_m = substr($e_ymd,4,2);
$e_d = substr($e_ymd,6,2);
// 해당 날짜를 time형식으로 변경
$f_time = mktime(0,0,0,$f_m,$f_d,$f_y);
$e_time = mktime(0,0,0,$e_m,$e_d,$e_y);

// 해당 요일을 숫자로 기록
$f_w = date("w",$f_time);
$e_w = date("w",$e_time);

// 시작 날과 마지막날의 주(일주일)을 제외한 시간 시간 계산
// f_next 해당 시작날의 다음주 일요일
// e_next 해당 마지막날의 이전 토요일
$f_next_time = mktime(0,0,0,$f_m,$f_d+(7-$f_w),$f_y);
$e_next_time = mktime(0,0,0,$e_m,$e_d-($e_w+1),$e_y);
$f_next_w = date("w",$f_next_time);
$e_next_w = date("w",$e_next_time);

// 해당 시작날과 마지막날의 time 차이를 기록
$next_ditime = $e_next_time-$f_next_time;
// next_ditime을 몇주간인지 계산
$next_weeknum = ((($next_ditime/60)/60/24)+1)/7;
// next의 수업횟수 계산
$next_weeknum_cnt = $next_weeknum*$day_cnt;

// 시작주의 포함된 횟수 구하기
$f_weeknum_cnt = 0;
for($i=6;$i>=$f_w;$i--){
if(in_array($i,$day))
$f_weeknum_cnt++;
}

// 마지막주 포함된 횟수 구하기
$e_weeknum_cnt = 0;
for($i=0;$i<=$e_w;$i++){
if(in_array($i,$day))
$e_weeknum_cnt++;
}

$all_weeknum = $next_weeknum_cnt+$f_weeknum_cnt+$e_weeknum_cnt;

return trim($all_weeknum);
}

3. 함수 내에서 사용되는 빈배열 제거 함수

// 빈 배열 제거 후 재정리 $arr_sort값을 넣어주면 빈배열만 제거하고 키는 그대로
function trim_array($Array , $arr_sort="") {
$ReturnArray = Array();

if($arr_sort){
foreach($Array as $key=>$value){
if(trim($value) != ""){
$ReturnArray[$key] = $value;
}
}
}else{
while ($Array) {
if ($Data = array_shift($Array)) {
array_push($ReturnArray, $Data);
}
}
}

return $ReturnArray;
}

이렇게 함수는 끝났습니다.
이 함수들 거의 쓸모가 없겟죠 -_-??
흠냐;; 완전 머리속 계산이 복잡했던 ㅋㅋ
필요하신분이 한분이라도 계시면 얼마든지 쓰세용~

그대신 많은 분이 사용하는 함수가 아니므로

꼭 댓글 달아주세요 ㅠ.ㅠ
추천
1

댓글 2개

전체 3,309 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT