Carbon 2 Дата разбора возвращает разные результаты - PullRequest
2 голосов
/ 28 февраля 2020

Итак, я получаю дату из URL-адреса, подобного этому 2020-05-23 И я пытаюсь разобрать его в углеродный объект, чтобы следующий код работал нормально

 $newDate = Carbon::parse('2020-05-23');
 dd($newDate);

, который возвращает это:

Carbon\Carbon @1590192000 {#279 ▼
   date: 2020-05-23 00:00:00.0 UTC (+00:00)
}

что правильно, но когда я пытаюсь получить первый и последний день этого месяца, он меняет переменную?

$newDate = Carbon::parse($date);
//dd($newDate);
dd($newDate, $newDate->firstOfMonth(), $newDate->endOfMonth());

затем возвращает

Carbon\Carbon @1590969599 {#279 ▼
   date: 2020-05-31 23:59:59.999999 UTC (+00:00)
}
Carbon\Carbon @1590969599 {#279 ▼
   date: 2020-05-31 23:59:59.999999 UTC (+00:00)
}
Carbon\Carbon @1590969599 {#279 ▼
   date: 2020-05-31 23:59:59.999999 UTC (+00:00)
}

так что это меняет дату на 20202-05-31? и ->firstOfMonth() возвращает то же, что и ->endOfMonth Я неправильно анализирую дату?

также когда я изменяю Carbon::parse('2020-05-23') на Carbon::now(), он работает нормально, но с другой датой курса

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Экземпляр даты mutable означает, что когда вы делаете что-то вроде $newDate->firstOfMonth(), оно изменится $newDate

Это можно прочитать во введении к документации https://carbon.nesbot.com/docs/#api -введение

Поэтому, когда вы выполните

dd($newDate, $newDate->firstOfMonth(), $newDate->endOfMonth());

, он выполнит firstMonth(), а затем endOfMonth() перед передачей параметров в dd(), и поскольку $newDate является изменяемым, содержание параметра будет три раза в конце месяца.

Вместо этого вы можете

dd($newDate, $newDate->copy()->firstOfMonth(), $newDate->copy()->endOfMonth());
1 голос
/ 28 февраля 2020

Carbon::Parse возвращает изменяемый объект. Это означает, что методы изменят объект, с которым вы работаете, вместо того, чтобы возвращать новый объект и сохранять исходное состояние без изменений.

Когда вы вызываете dd, PHP сначала должен подготовить 3 аргумента, чтобы он вызывал оба метода на объекте с последним изменением даты на последний день месяца.

Если вы хотите, чтобы объект был неизменным, вы должны использовать CarbonImmutable

$newDate = CarbonImmutable::parse($date);
dd($newDate, $newDate->firstOfMonth(), $newDate->endOfMonth());

Смотрите здесь для получения дополнительной информации: https://carbon.nesbot.com/docs/

0 голосов
/ 28 февраля 2020

Итак, я обнаружил проблему, и я не могу понять, почему это происходит?

Но при выполнении только dd($newDate->firstOfMonth()) все работает нормально и возвращает первую дату, но при добавлении $newDate->endOfMonth(), чтобы сделать ее dd($newDate->firstOfMonth(), $newDate->endOfMonth()) возвращает в два раза больше $newDate->endOfMonth() что странно? и я не знаю, если это ошибка в laravel углерод или просто php

то же самое для var_dump

...