Дата и время в углеродном формате Laravel 5

У меня есть массив, который возвращает следующую дату и время:

$item['created_at'] => "2015-10-28 19:18:44"

Как изменить формат даты на M d Y в Laravel с помощью Carbon?

В настоящее время возвращается с ошибкой

$suborder['payment_date'] = $item['created_at']->format('M d Y');

person d3bug3r    schedule 29.10.2015    source источник
comment
Похоже, что created_at не содержит экземпляра углеродного объекта.   -  person Jeemusu    schedule 29.10.2015
comment
@Jeemusu Ага, так как я могу преобразовать его в один?   -  person d3bug3r    schedule 29.10.2015
comment
Вы конвертируете модель в массив? Потому что по умолчанию это экземпляр Carbon.   -  person Thomas Kim    schedule 29.10.2015
comment
И еще не задан вопрос, существует ли особая потребность в масштабах для переименования created_at в payment_date? Просто используйте $payment->created_at в шаблоне лезвия напрямую.   -  person Roland    schedule 23.10.2018
comment
И: created_at - это внутренний столбец Laravel, он появляется автоматически, когда вы используете $table->timestamps() в файле миграции. Кроме того, вы НЕ должны устанавливать его самостоятельно.   -  person Roland    schedule 23.10.2018
comment
@Jeemusu, что может произойти, когда $table->timestamps(); будет использоваться позже, когда уже есть данные. Затем, возможно, используйте вспомогательную функцию для обработки null значений, например function formatCarbon (Carbon $carbon = null) : string { ... }   -  person Roland    schedule 23.10.2018


Ответы (10)


Сначала проанализируйте поле created_at как объект Carbon.

$createdAt = Carbon::parse($item['created_at']);

Тогда вы можете использовать

$suborder['payment_date'] = $createdAt->format('M d Y');
person Milan Maharjan    schedule 29.10.2015

Если вы используете красноречивую модель (я думаю, что это так, глядя на ваш код), вам не нужно преобразовывать ее в массив. Просто используйте его как объект. Бекаус элике Томас Ким сказал, что по умолчанию это экземпляр Carbon

Так и должно быть

$suborder['payment_date'] = $item->created_at->format('Y-m-d')

Но если это не так, вам нужно преобразовать его в объект Carbon, как отвечает Милан Махарджан.

$createdAt = Carbon::parse($item['created_at']);
person fajarhac    schedule 29.10.2015
comment
Хороший момент с использованием Payment $payment, поэтому нет необходимости преобразовывать его в массив, вы всегда можете использовать прямые объекты модели Eloquent в своих шаблонах лезвий. Но все же я бы предпочел не переименовывать created_at в payment_date. - person Roland; 23.10.2018

Объявить в модели:

class ModelName extends Model
{      

 protected $casts = [
    'created_at' => 'datetime:d/m/Y', // Change your format
    'updated_at' => 'datetime:d/m/Y',
];
person Filipe Cruz    schedule 17.05.2018
comment
Это уже лучшее решение, поскольку это подход для каждой модели, но он немного неполный. Для внутренних столбцов Laravel created_at и updated_at нет необходимости в protected $dates = []; в вашем Model. Но если у вас есть настраиваемые столбцы, как у меня, вы должны добавить их в этот массив и не добавлять protected $timestamps = true; в свою модель, поскольку это значение по умолчанию. - person Roland; 23.10.2018

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

$createdAt = Carbon::parse(date_format($item['created_at'],'d/m/Y H:i:s');
$createdAt= $createdAt->format('M d Y');
person li bing zhao    schedule 25.05.2017
comment
В этом нет необходимости, created_at автоматически преобразуется в Carbon\Carbon, если protected $timestamps = false; НЕ установлен. Вам также понадобится $table->timestamps(); в файле миграции. - person Roland; 23.10.2018

Метки времени Laravel 5 являются экземплярами класса Carbon, поэтому вы можете напрямую вызывать метод форматирования строк Carbon для своих меток времени. Что-то вроде этого в вашем файле просмотра.

{{$task->created_at->toFormattedDateString()}}

http://carbon.nesbot.com/docs/#api-formatting

person Tushar    schedule 03.11.2017
comment
Это верно только для записей, созданных после добавления created_at, например добавив $table->timestamps() в ваш файл миграции, для записей перед ним created_at будет NULL, а затем это вызовет ошибку о вызове метода при вызове, не являющемся объектом. - person Roland; 30.10.2018

просто используйте

Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->format('M d Y');
person Anjani Barnwal    schedule 22.11.2019

Просто используйте функции date() и strtotime() и сэкономьте свое время

$suborder['payment_date'] = date('d-m-Y', strtotime($item['created_at']));

Не переживайте !!!

person DAVID AJAYI    schedule 28.03.2020

Добавьте свойство cast в вашу модель

protected $casts = [
'created_at' => 'date', 
'payment_date' => 'date'
];

Если вы также хотите отформатировать datetime, просто добавьте datetime вместо date

protected $casts = [
'created_at' => 'datetime',
'payment_date' => 'datetime'
]
person WilliamDk    schedule 07.03.2021

person    schedule
comment
Я пробовал этот подход, но когда поле равно нулю, оно преобразуется в странную дату: 'date_confirmation' => string '-0001-11-30 00:00:00' (length=20). Вы знаете, почему это происходит и как я могу это решить? - person slayerbleast; 24.08.2018
comment
Это индивидуальный подход. Я ищу более общий подход, это означает, что запись конфигурации и все атрибуты Carbon\Carbon отформатированы одинаково (я уже использую protected $dates = ['my_date_at'];). - person Roland; 23.10.2018

person    schedule
comment
Payment->created_at затем переименовывается в payment_date и не используется прямой класс Payment (модель Eloquent), который допускает только array $item в качестве подсказки типа. Может не то, что ты хочешь? - person Roland; 23.10.2018
comment
Могу я спросить, почему я получаю отрицательные голоса за этот ответ? Я только что получил -2, что кажется немного несправедливым, потому что мои критики на 2-ю позицию считают хорошей. - person Roland; 29.10.2018