[PHP] 저주받은 함수: strtotime
해묵은 레거시 프로그램을 뒤져보다 찾은 황당한 사례를 정리해본다.
strtotime은 기본적으로, 문자열 형태의 날짜값을 타임스탬프 정수로 변환해주는 함수다.
다음과 같이 단순하게 사용할 때엔 문제가 없다.

이 함수는 첫번째 인자로 interval 값을, 두번째 인자로 기준이 될 타임스탬프 정수를 주면 시간을 빼거나 더하는 기능도 제공하는데, 여기서 심각한 기능적 결함이 존재한다.
위처럼 일반적인 경우에는 동작하는데
2021-03-31일로 하면
?? 이상하게 동작해버린다.
우리가 기대한 값은 2월 말일인데...
이게 달을 빼면 달 숫자 하나만 빼는게 아니라,
[이전달의 총 일수]만을 빼버리는 황당한 로직을 갖고 있기 때문이다.
2월이 총 28일이라 28일만 빼서 3월 3일이 된 것이다.
내장함수부터 이모양이면 어쩌자는 것인지...
가장 간단한 해결법은 carbon 등의 서드파티 라이브러리를 이용하는 것이다.
여의치 않으면 직접 재구현해서 사용하거나...
참조
https://blog.munilive.com/posts/In-strtotime-1-months-or-1-month-ago-is-not-30-days-old.html