PHP Carbon 달을 더하거나 뺄때 오버플로우(overflow)되지 않게 하기
Carbon 에 addMonth() 나 subMonth() 로 특정 달을 구하고 그 달의 첫째나 마지막 날을 구해야 하는 경우가 있습니다.
예로 매달 마지막 날에 정기 결제가 이뤄질 경우 현재 달이 2월이면 다음 달의 마지막을 구해서 스케줄러에 등록하고 결제 처리를 할 수 있습니다.
$m = Carbon\Carbon::parse('2021-02-01'); var_dump($m->addMonth()->lastOfMonth()->format('Y-m-d')); // string(10) "2021-03-31"
하지만 다음 코드를 실행하면 의도와는 다르게 2월이 아닌 3월의 마지막 날이 출력되므로 정기 결제가 안 되는 큰 문제가 발생할 수 있습니다.
$m = Carbon\Carbon::parse('2021-01-31'); var_dump($m->addMonth()->lastOfMonth()->format('Y-m-d')); // string(10) "2021-03-31"
이런 문제를 해결하기 위해 Carbon 2.x 부터는 addMonthNoOverflow(), subMonthNoOverflow() 같이 NoOverflow 가 붙는 메서드가 있고 이를 사용하면 달이 오버플로우되는 문제를 해결할 수 있습니다.
$m = Carbon\Carbon::parse('2021-01-31'); var_dump($m->addMonthNoOverflow()->lastOfMonth()->format('Y-m-d')); // string(10) "2021-02-28"