PHP, 주차로 기간검색 하기

요즘 myhabit 이라는 습관관리 어플리케이션을 PHP(CODEIGNITER)로 개발하고 있다.

간략하게 설명하자면 사용자는 자신이 원하는 습관을 등록하고 이것을 1주일 단위로 관리하는 어플리케이션이다. 예를들면, 영어공부를 2시간씩 일주일에 3번하는 습관을 기르고자 한다면 이것을 습관으로 등록하고 영어공부를 한 번씩 할 때마다 체크를 하여 나중에 이에 대한 통계(목표달성률)를 보는 웹어플리케이션이다. 그러면 사용자는 자신이 언제 영어공부를 열심히 했고 언제 열심히 안 했는지 알 수 있으며 영어공부에 대한 자신의 현재 상황도 항상 체크를 할 수 있기 때문에 좋은 습관을 기르는데 도움이 될 수 있을 것이다.

 

아무튼 이 어플리케이션은 습관을 주간단위로 관리를 하기 때문에 아래와 같은 주단위의 기간검색이 필요하다. 만약 아래처럼 검색을 한다면 2015년 3월 2째주의 월요일(From)부터 2015년 4월 3째주의 일요일(To)에 해당하는 데이터를 불러오면 된다. 기간검색

그런데 생각해보니 이게 그렇게 간단하진 않다.  2015년 3월 2째주의 월요일이 몇일인지 한 번에 알려줄 함수도 없을 뿐더러(물론 내가 모르는 것일 수도 있다.) 주차를 계산할 때는 목요일을 기준으로 계산해야 한다는 조건도 있기 때문이다. 예를들어, 1월 1일이 목요일이면 1월1일은 1월의 첫번째 주가 되지만 만약 1월 1일이 금요일이면 1월 1일은 작년 12월의 마지막 주가 된다. 그래서 주를 계산하기 위한 방법에 대해 서치를 좀 했으나 내가 원하는 답을 찾기 어려웠다. 그래서 혹시나 나와 같은 초보자들을 위해 내가 해결한 간단한(?) 방법을 공유하고자 한다.

2015년 1월

 

 

————–해결방법(아래와 같은 방법으로 선택한 주의 날짜를 계산했다.)———————-

3월 2째주의 월요일을 알기 위해서는 2월 28일의 요일을(전 달 마지막 날의 요일) 먼저 확인한다. 그리고 2월 28일의 요일이 수요일보다 크면 ‘2월 28일이 속한 주’는 2월의 마지막주이므로 ‘2월 28일이 속한 주’의 월요일부터 2주 뒤의 날짜가 3월 2째주의 월요일이 된다.

반대로 2월 28일의 요일이(전 달 마지막 날의 요일) 수요일보다 같거나 작으면 ‘2월 28일이 속한 주’는 3월의 첫째주이므로 ‘2월 28일이 속한 주’의 월요일부터 1주 뒤의 날짜가 3월 2째주의 월요일이 된다.

if (date(‘N’, 2월 28일) >3) {

3월 2째주의 날짜 = 2월 28일이 속한 주의 월요일  + (7 *(3월의 구하려는 주 ));

}

if(date(‘N’, 2월 28일) =<3) {

3월 2째주의 날짜 = 2월 28일이 속한 주의 월요일 + (7 *(3월의 구하려는 주 – 1));

}

 

 

—————코드는 아래와 같다.———————————————

*참고로 나는 개발자가 아닌 기획자다. 그래서 코드가 허접하다는 것을 참고하기 바란다.

만약 아래 코드를 이용하여 2015년 3월 2째 ~ 2015년 4월 3째주에 대한 기간검색을 한다면 2015-03-09 00:00:00(월요일) ~ 2015-04-19 23:59:00(일요일) 의 결과를 얻을 수 있을 것이다.

 

// 2015년 3월 2째주일 경우
//$year = 2015
//$month = 3
//$week = 2

function week_search_from($year, $month, $week)
{
            $last_month_endday = mktime(0,0,0, $month-1, date('t', mktime(0, 0, 0, $month-1, 1, $year)), $year);
            // 선택한 전 달의  마지막 날짜를 먼저 구한다.
            $last_month_endday_weekday = date('N', $last_month_endday);
            //그리고 그 날짜의 요일을 구한다.
            $monday_interval =  abs(1-$last_month_endday_weekday);
            $week_start= $last_month_endday - (60*60*24)*$monday_interval;
            // 마지막 날짜가 속한 주의 월요일
            

            if($last_month_endday_weekday > 3)
              // 선택한 전 달의  마지막 날짜가 수요일보다 크면 
            {
                $search_day = date('Y-m-d H:i:s', $week_start + (60*60*24)*7*$week); 
            }
            else
            {
                $search_day = date('Y-m-d H:i:s', $week_start + (60*60*24)*7*($week-1)); 
            }
            return $search_day;
}



// 2015년 4월 3째주일 경우
//$year = 2015
//$month = 4
//$week = 3
function week_search_to($year, $month, $week)
{
            $last_month_endday = mktime(0,0,0, $month-1, date('t', mktime(0, 0, 0, $month-1, 1, $year)), $year);
            // 선택한 전 달의  마지막 날짜
            $last_month_endday_weekday = date('N', $last_month_endday);
            $sunday_interval = 7-$last_month_endday_weekday;
            $week_end= $last_month_endday+(60*60*24)*$sunday_interval;
            // 마지막 날짜가 속한 주의 일요일
            if($last_month_endday_weekday > 3)
              // 선택한 전 달의  마지막 날짜가 수요일보다 크면 
            {
                $search_day = date('Y-m-d H:i:s', $week_end + (60*60*24) *7*$week + (60*60*23)+(60*59); 
               //일요일은 월요일과 달리 00:00시가 아니라 23시 59분이어야 하므로 마지막에 (60*60*23)+(60*59)를 더했다.
            }
            else
            {
                $search_day = date('Y-m-d H:i:s', $week_end +(60*60*24)*7*($week-1)+(60*60*23)+(60*59));
                //일요일은 월요일과 달리 00:00시가 아니라 23시 59분이어야 하므로 마지막에 (60*60*23)+(60*59)를 더했다. 
            }
            return $search_day;
}

 

0 Shares:
답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

기획자와 스토아철학

기획자로서 일을 하다보면 생각보다 많은 부분에서 우울할 때가 있다. 그 우울함이 심해지면 '나는 과연 필요한 존재가 맞는가?'라는 생각까지 들곤 한다. 문제는 이런 경험을 자주 할수록 자존감이 낮아진다는 것이다. 내가 겪어온 경험을 토대로 이 문제를 어떻게 극복했는지 이야기하고자 한다.
Read More

내 리더가 회사를 떠났다.

어떤 한 사람이 있다. 그 사람을 보면서 나는 이런 생각을 했다. "저 분의 인성과 역량을 닮고 싶다. 내 아들이 커서 어른이 된다면 나의 모습보다는 저 분의 모습을 닮았으면 좋겠다." 그 분은 내가 현재 재직중인 회사의 CTO이자 나의 리더였다. 아이러니하게도 그 분과 나는 전혀 다른 성격의 소유자이고 업무 스타일도 많이 달랐다. 하지만 난 정말로 그분을 닮고 싶었다.
2021년 회고
Read More

2021년 회고(Product Owner, 가족, 성장)

회사에는 동료와 일이 있다. 가정에는 아내와 애들, 육아업무가 있다. 그러나 그 어디에도 나는 없었다. 원래 나 본연의 내가 존재할 수 있는 시간과 장소는 없었다. 단지, 의무로서의 나만 존재했다. 언뜻 생각해보면 참 서글프기도 하지만 잘 생각해보면 꼭 그렇지도 않다. 현재 나의 상황, 역할, 가족, 일.....그 모든 것이 결국은 나를 구성한다. 원래 나 본연의 나는 처음부터 없는 것인지도 모르겠다.