개발하다 보면 날짜 계산하는 경우가 아주 많다. 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
이렇게 하면 위와 같은 이슈를 해결할 수 있으며, 원하는 결과값을 가져올 수 있다.
'PHP' 카테고리의 다른 글
[Laravel]CQRS 적용, Elasticsearch (1) (0) | 2023.08.24 |
---|---|
[Laravel]queue를 이용한 비동기 분산 처리 (0) | 2023.08.19 |
[laravel]리포지토리 패턴 도입하기, 인터페이스 의존성 주입(DI) (0) | 2023.08.17 |
모던 PHP, PSR, clean code (0) | 2023.08.16 |
laraval sail을 이용한 환경 구축 (0) | 2023.08.13 |