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),
}
반응형