php strtotime month issue

2012. 10. 31. 12:54Development/Tip

PHP의 strtotime을 이용하여 이전 달, 다음 달 등의 월 정보를 가져오는 로직을 사용하다가 발견한 이슈입니다.


현재 날짜: 2012-10-31

 

echo date('Y-m-d', strotitme('-1 month'));

기대결과: 2012-09-30

실제결과: 2012-10-01

 

echo date('Y-m-d', strotitme('+1 month'));

기대결과: 2012-11-30

실제결과: 2012-12-01


이는 기준 일자보다 추출 대상의 일자가 적을때 +-1 day가 추가적으로 계산되면서 발생됩니다.


php 공식사이트 이슈리포트에 보면 많은 이들이 이슈제기를 했지만,

버그가 아니기때문에 다른 방법으로 사용하라고 명시하고 있더군요.


그래서 저는 다음과 같은 커스텀 펑션을 하나 만들어서 우회 사용하고 있습니다.


/**

 * php strtotime month 사용과 관련한 이슈 우회처리

 * @param sTime     string      date/time string

 * @param iTime     int         unixtimestamp

 */

function strtotimeMonth($sTime, $iTime=null)

{

    if (is_null($iTime) === TRUE || is_int($iTime) === FALSE) {

        $iTime = time();

    }

    $sTransDay = date('d', $iTime);

    $sLastDay = date('t', $iTime);

    if ($sTransDay == $sLastDay) {

        $iResTime = strtotime('last day of ' . $sTime, $iTime);

    } else {

        $iResTime = strtotime($sTime, $iTime);

    }

    return $iResTime;

}