Как получить первый и последний день предыдущего месяца с углеродом - Laravel

Мне нужен первый и последний день предыдущего месяца с использованием Carbon Library, я попробовал следующее:

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

Результат, который я получаю для $firstDayofPreviousMonth = '2016-04-01' (текущий месяц - 5-й), а для $lastDayofPreviousMonth = '2016-05-01'.

Я получаю правильный результат для $firstDayofPreviousMonth, но это дает мне 30-дневный предыдущий результат и дает неправильный результат для $lastDayofPreviousMonth.

Может ли кто-нибудь помочь мне с этим?

Ответы

Ответ 1

Попробуй это:

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

Ответ 2

Просто попробуйте это

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

Ответ 3

С этим... дата начала инициализации в 00:00 и окончания конца даты в 23:59

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

Ответ 4

Чтобы конкретно ответить на ваш вопрос, почему вы получаете неправильный результат для $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.

Это оставляет нам недопустимую дату - 31 апреля. Дополнительный день просто добавляется к последней действительной дате (2016-04-30 + 1), которая переводит дату в мае (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

Ответ 5

В настоящее время в Carbon появляется ошибка при использовании метода

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

Ошибка приводит к возврату последнего дня как 30 для тех месяцев, которые имеют 31 день.

IE - если вы в марте, и вы выполняете вышеуказанный вызов, он вернется в 2017-03-30, а не 2017-03-31, как и следовало ожидать.

Поскольку я делал операцию между датами, я в конечном итоге использовал..

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

Это привело к правильной дате dateTimeString для тех дней, которые заканчиваются 31-м.