Laravel

[Laravel] subMonth / addMonth 사용 시 주의사항

먹세 2021. 12. 31. 16:16

31일에 subMonth 또는 addMonth 를 사용하게 되면

전달의 마지막날, 혹은 다음달의 마지막날이 나오지 않는다.

예를들어 12월 31일에 subMonth(1) 을 사용하게 되면,

11월 31일이 나와야 하는데 12월 1일이 나오게 됨

>>> $m = Carbon\Carbon::now()
=> Carbon\Carbon @1640933706 {#3627
     date: 2021-12-31 15:55:06.929429 Asia/Seoul (+09:00),
   }

>>> $m->subMonth(1)
=> Carbon\Carbon @1638341872 {#3628
     date: 2021-12-01 15:57:52.344882 Asia/Seoul (+09:00),
   }

 

addMonth(2) 를 했을 때 2월 28일을 예상하지만 3월 3일이 나옴

>>> $m = Carbon\Carbon::now()
=> Carbon\Carbon @1640933711 {#3630
     date: 2021-12-31 15:55:11.729071 Asia/Seoul (+09:00),
   }
   
>>> $m->addMonth(2)
=> Carbon\Carbon @1646290511 {#3630
     date: 2022-03-03 15:55:11.729071 Asia/Seoul (+09:00),
   }

마지막 날이 28일 30일 31로 일정하지 않기 때문에 생기는 문제.

 

해결방법 1 :

addMonthNoOverflow() 와 subMonthNoOverflow() 를 사용하게 되면, 날짜가 넘어가는 것을 방지할 수 있다.

>>> $m = Carbon\Carbon::now()
=> Carbon\Carbon @1640934166 {#3636
     date: 2021-12-31 16:02:46.168533 Asia/Seoul (+09:00),
   }
   
>>> $m->subMonthNoOverflow(1)
=> Carbon\Carbon @1638255766 {#3636
     date: 2021-11-30 16:02:46.168533 Asia/Seoul (+09:00),
   }
>>> $m = Carbon\Carbon::now()
=> Carbon\Carbon @1640934230 {#3642
     date: 2021-12-31 16:03:50.367929 Asia/Seoul (+09:00),
   }
   
>>> $m->addMonthNoOverflow(2)
=> Carbon\Carbon @1646031830 {#3642
     date: 2022-02-28 16:03:50.367929 Asia/Seoul (+09:00),
   }
>>>

 

해결방법 2 :

아래 코드를 ServiceProvider 등에 등록해놓고 편하게 subMonth / addMonth를 사용하는 방법

Carbon::useMonthsOverflow(false);

>>> Carbon\Carbon::useMonthsOverflow(false);
=> null

>>> $m = Carbon\Carbon::now()
=> Carbon\Carbon @1640934824 {#3629
     date: 2021-12-31 16:13:44.829908 Asia/Seoul (+09:00),
   }
   
>>> $m->subMonth(1)
=> Carbon\Carbon @1638256424 {#3629
     date: 2021-11-30 16:13:44.829908 Asia/Seoul (+09:00),
   }
>>> Carbon\Carbon::useMonthsOverflow(false);
=> null

>>> $m = Carbon\Carbon::now()
=> Carbon\Carbon @1640934849 {#3634
     date: 2021-12-31 16:14:09.517122 Asia/Seoul (+09:00),
   }
>>> $m->addMonth(2)
=> Carbon\Carbon @1646032449 {#3634
     date: 2022-02-28 16:14:09.517122 Asia/Seoul (+09:00),
   }

 

반응형