PHP

주(week) 계산 function

은둔한량 2013. 2. 18. 14:58
반응형

/**
* 주 계산 function
*
* $from 에서 $to 까지의 주수를 계산
* $offset 을 지정하므로써 주의 개시요일을 지정
*
* @param  String  $from 요일문자열(strtotime에 의존)
* @param  String  $to  요일문자열(strtotime에 의존)
* @param  Integer $offset 개시요일(0-6:Sun-Sat)
* @return Integer
*/

function getWeeks($from, $to, $offset = 0) {
    // Unix time 으로 변환
    $fromT = strtotime($from);
    $toT   = strtotime($to);

    // from <= to 관계를 유지
    if ($fromT > $toT) {
        $t     = $fromT;
        $fromT = $toT;
        $toT   = $fromT;
    }

    // from - to 의 일수를 계산
    $diffD = ceil(($toT - $fromT) / 86400);

    // from 과 to의 요일번호를 취득
    $fromW = adjustWeekNumber($fromT, $offset);
    $toW   = adjustWeekNumber($toT, $offset);

    if ($diffD == 0) {
        return 1;
    } else if ($diffD < 7) {
        return ($fromW > $toW) ? 2 : 1;
    } else {
        if ($fromW == 0 and $toW == 6) {
            return $diffD / 7;
        } else if (($fromW != 0 and $toW == 6) or ($fromW == 0 and $toW != 6)) {
            return ceil(($diffD + 1) / 7);
        } else {
            return ceil(($diffD - (7 - $fromW) - ($toW + 1)) / 7) + 2;
        }
    }
}

/**
* 주가 offset부터 시작되도록 요일번호를 조정
*
* @param Integer $time
* @param Integer $offset (0-6:Sun-Sat)
* @return Integer
*/
function adjustWeekNumber($time, $offset = 0) {
    $offset = ($offset < 0 or $offset > 6) ? 0 : $offset;
    $week   = date("w", $time);
    return ($week < $offset) ? (6 - $week) : ($week - $offset);
}

반응형