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

내 리더가 회사를 떠났다.

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

주니어 기획자의 성장과 커리어에 대한 조언

도메인에 대한 이해가 높으면 문제를 제대로 정의할 수 있고 문제를 제대로 정의하면 합리적인 가설을 세워서 효과적인 데이터 분석을 할 수 있다. 데이터 분석을 통해 새로운 도메인 지식이 쌓인다. 이 과정을 반복하면, 기획역량은 자연스럽게 성장한다.
2021년 회고
Read More

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

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

PO, PM들의 존재이유를 알려주는 책, 인스파이어드

일반적으로 제품개발(Product 개발)이라고 하면 기획/디자인/개발 과정을 거쳐 Product이 완성되는 과정을 의미한다. 그런데 인스파이어드 책의 저자 마티 케이건은 제품을 발견하는 과정과 제품을 시장에 전달하는 과정도 제품개발에 속한 과정이라고 정의한다. 그런 의미로 볼 때 Product을 개발한다는 것은 영업/마케팅 조직의 비지니스 과정과 분리되어 있지 않다는 것을 의미한다.
Read More

FE 개발자와 SEO 적용하기

SEO 작업을 통해 검색결과 첫 페이지의 상위 5위 안에 드는 것이 중요하다. 이번 포스팅에서는 내가 담당하고 있는 Product의 FE 개발자와 SEO를 적용하면서 알게된 사항들을 공유하고자 한다.