Ответ 1
Попробуй это:
$start = new Carbon('first day of last month');
$end = new Carbon('last day of last month');
Мне нужен первый и последний день предыдущего месяца с использованием 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
.
Может ли кто-нибудь помочь мне с этим?
Попробуй это:
$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();
С этим... дата начала инициализации в 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.
Это оставляет нам недопустимую дату - 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
В настоящее время в Carbon появляется ошибка при использовании метода
Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();
Ошибка приводит к возврату последнего дня как 30 для тех месяцев, которые имеют 31 день.
IE - если вы в марте, и вы выполняете вышеуказанный вызов, он вернется в 2017-03-30, а не 2017-03-31, как и следовало ожидать.
Поскольку я делал операцию между датами, я в конечном итоге использовал..
Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();
Это привело к правильной дате dateTimeString для тех дней, которые заканчиваются 31-м.