UFO ET IT

카본으로 전월의 첫날과 마지막 날을 얻는 방법 - 라라벨

ufoet 2023. 8. 21. 23:01
반응형

카본으로 전월의 첫날과 마지막 날을 얻는 방법 - 라라벨

Carbon Library를 사용하는 지난달의 첫째 날과 마지막 날이 필요합니다. 제가 시도한 것은 다음과 같습니다.

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateString();

내가 얻는 결과는$firstDayofPreviousMonth = '2016-04-01'(현재 달이 5일(5월)) 및 다음 기간 동안$lastDayofPreviousMonth = '2016-05-01'.

에 대한 정확한 결과를 얻고 있습니다.$firstDayofPreviousMonth하지만 그것은 나에게 30일 전의 결과를 주고 있고, 나에게 잘못된 결과를 주고 있습니다.$lastDayofPreviousMonth.

이것 좀 도와주실 분 있나요?

사용해 보십시오.

$start = new Carbon('first day of last month');
$end = new Carbon('last day of last month');

이것만 드셔보세요.

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();

업데이트된 코드, 더 정확한 코드

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonthsNoOverflow()->toDateString();

$lastDayofPreviousMonth = Carbon::now()->subMonthsNoOverflow()->endOfMonth()->toDateString();

@켄파이 감사합니다.

이것으로...00:00에 시작하는 날짜와 23:59에 끝나는 날짜

$start = new Carbon('first day of last month');
$start->startOfMonth();
$end = new Carbon('last day of last month');
$end->endOfMonth();

왜 잘못된 결과를 얻었는지에 대한 질문에 구체적으로 답하기$lastDayofPreviousMonth.

다음 예제에서 이 문을 분석해 보겠습니다.

Carbon::now()->endOfMonth()->subMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->endOfMonth() > 2016-05-31
// ->subMonth() > 2016-04-31 // Simply takes 1 away from 5.

이것은 우리에게 유효하지 않은 날짜를 남깁니다. 4월 31일은 없습니다.추가 날짜는 마지막 유효 날짜(2016-04-30 + 1)에 추가되어 날짜가 5월(2016-05-01)로 롤됩니다.

앞에서 언급한 것처럼 이러한 일이 발생하지 않도록 하려면 항상 다른 작업을 수행하기 전에 날짜를 월 1일로 재설정합니다(매달 1일이 있는 경우).

$lastDayofPreviousMonth = Carbon::now()->startofMonth()->subMonth()->endOfMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->startofMonth() > 2016-05-01 00:00:00
// ->subMonth() > 2016-04-01 00:00:00
// ->endOfMonth() > 2016-04-30 23:59:59

현재 카본에서 메소드 사용 시 버그가 발생하였습니다.

Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();

이 버그는 31일이 있는 달의 경우 마지막 날을 30으로 반환합니다.

IE - 3월에 위의 통화를 실행하면 예상대로 2017-03-31이 아닌 2017-03-30이 반환됩니다.

날짜 간 작업을 하다가 결국 사용하게 되었습니다.

Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();

이것은 31일에 끝나는 해당 날짜에 대한 정확한 dateTimeString으로 끝났습니다.

또 다른 해결책은 탄소 방법을 사용하는 것입니다.subMonthNoOverflow():

$lastDayofPreviousMonth = Carbon::now()->subMonthNoOverflow()->endOfMonth()->toDateString();

31일 월호로 넘어가면 여기서 찾을 수 있습니다. https://github.com/briannesbitt/Carbon/issues/627

이것은 나에게 효과가 있습니다.

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateTimeString(); // 2021-08-01 00:00:00
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateTimeString(); // 2021-08-31 23:59:59

단일 $date 변수 사용

$date = Carbon::now();

$firstDayofPreviousMonth = $date->startOfMonth()->subMonth()->toDateTimeString(); // 2021-08-01 00:00:00

$lastDayofPreviousMonth = $date->endOfMonth()->toDateTimeString(); // 2021-08-31 23:59:59

언급URL : https://stackoverflow.com/questions/37153903/how-to-get-first-and-last-day-of-previous-month-with-carbon-laravel

반응형