본문 바로가기

PHP

PHP strtotime 이전 달 구할때 주의 할 점!

개발하다 보면 날짜 계산하는 경우가 아주 많다. php에선 기본적으로 날짜 함수 strtotime를 제공하고 있고 날짜 계산하는 방법은 아주 쉽고, 간단하다. 

그래서인지 특히, 이전달을 구할때 strtotime -1 month를 쓰고 그냥 되겠거니 하고 코딩했다가 운영하고있는 사이트가 큰 이슈를 발생시킬수 도있다. 구글 검색으로 날짜 계산하기로 여러 곳에 찾아봐도 해당 이슈를 찾아보기도 어려웠다.

 

https://www.php.net/manual/en/function.strtotime.php

 

PHP: strtotime - Manual

I tried using sams most popular example but got incorrect results.Incorrect: Then I read the notes which said:if the separator is a slash (/), then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.), then the European d-m-y

www.php.net

strtotime 함수로 원하는 날짜를 계산할 수 있으며, 이전 달도 구할 수도 있다.

echo strtotime("-1 month");

보통의 날짜인 경우 정상적으로 나오지만 마지막 일 30, 31, 2월의 28일인 경우엔 이전 달이 안나오는 현상이 발생한다. 

예로들어, 아래와 같이 코딩을 해보면

$date = '2020-03-31';
date("Y-m-d", strtotime("-1 month", strtotime($date)));

// outputs 2020-03-02

결과값이 3월 2일로 나오는 것을 확인할 수 있다. 내가 원하는 날짜는 2020-02월인데, 2020-03로 나온다.

이렇게 나오는 이유는 strtotime 함수의 -1 month는 이전달의 총 일수 만큼 빼기 때문이다.

현재 3월이라면 이전달인 2월의 총 일수 28일만 뺀다는 것이다.

그러므로 3월 2일로 나오는 것이다.

# 해결방법

이것을 해결하는 방법으로는 미리 1일로 설정 한 후 -1 month를 하는것이다.

$time = strtotime(date('Y-m-01'));
echo date("Y-m", strtotime("-1 month", $time));

// outputs 2020-02

이렇게 하면 위와 같은 이슈를 해결할 수 있으며, 원하는 결과값을 가져올 수 있다.