Как изменить формат по умолчанию при значении created_at и updated_at laravel

#php #laravel-4 #timestamp #eloquent

#php #laravel-4 #временная метка #красноречивый

Вопрос:

Я новичок в Laravel. Я создаю приложение с помощью laravel. Когда я создаю сообщение, значения «created_at» и «updated_at» выглядят следующим образом:

 2014-06-26 04:07:31
2014-06-26 04:07:31
  

Но я хочу, чтобы эти значения без времени выглядели так :

 2014-06-26
2014-06-26
  

Только дата без времени.

Возможно ли это???

Пожалуйста, помогите мне.

Моя модель Post:

 <?php

class Post extends Eloquent {

    protected $fillable = array('title', 'body', 'meta','reporter', 'slug', 'image','top');

    public static $rules = array(
        'title'=>'required|min:2',
        'body'=>'required|min:20',
        'reporter'=> 'required|min:2',
        'image'=>'image|mimes:jpeg,jpg,bmp,png,gif'
    );

    public function categories()
    {
        return $this->belongsToMany('Category');
    }

}
  

Мое хранилище Post Controller:

 public function store()
{
    $validator = Validator::make(Input::all(), Post::$rules);

    if ($validator->passes()) {
        $post = new Post;
        $post->title = Input::get('title');
        $post->body = Input::get('body');
        $post->reporter = Input::get('reporter');
        $post->meta = Input::get('meta');
        $post->slug = Input::get('title');
        $post->top = Input::get('top');

        $image = Input::file('image');
        if ($image) {
            $filename = date('Y-m-d-H:i:s')."-".$image->getClientOriginalName();
            Image::make($image->getRealPath())->resize(250, 145)->save('public/images/postimages/'.$filename);
            $post->image = 'images/postimages/'.$filename;
        }


        $categories = Input::get('categories');

        $post->save();

        $post->categories()->sync($categories);

        return Redirect::route('admin.posts.index')
            ->with('message', 'Product Created');
    }

    return Redirect::back()
        ->with('message', 'Something went wrong')
        ->withErrors($validator)
        ->withInput();
}
  

Пожалуйста, помогите мне.

Ответ №1:

В вашей Post модели добавьте два метода доступа, подобные этому:

 public function getCreatedAtAttribute($date)
{
    return CarbonCarbon::createFromFormat('Y-m-d H:i:s', $date)->format('Y-m-d');
}

public function getUpdatedAtAttribute($date)
{
    return CarbonCarbon::createFromFormat('Y-m-d H:i:s', $date)->format('Y-m-d');
}
  

Теперь каждый раз, когда вы используете эти свойства из своей модели для отображения даты, они будут представлены по-разному, например, просто дата без времени:

 $post = Post::find(1);
echo $post->created_at; // only Y-m-d formatted date will be displayed
  

Таким образом, вам не нужно изменять исходный тип в базе данных. чтобы изменить type в вашей базе данных, вам нужно изменить его на Date from Timestamp , и вам нужно сделать это из вашей миграции (если вы вообще используете) или непосредственно в вашей базе данных, если вы не используете миграцию. timestamps() Метод добавляет эти поля (с помощью миграции), и чтобы изменить эти поля во время миграции, вам нужно удалить timestamps() метод и использовать date() вместо него, например:

 $table->date('created_at');
$table->date('updated_at');
  

Комментарии:

1. Работает, но вы не должны изменять формат внутри вашей модели. Вы должны сделать это из своего представления: $post->created_at->format(‘Y-m-d’); Вы также можете изменить формат глобально для каждой даты, используя статический метод Carbon Carbon::setToStringFormat(‘Y-m-d’);

2. Laravel предоставляет удобный способ сделать это из model вместо того, чтобы использовать его в каждом представлении, здесь нет ничего плохого, но есть и другие способы, например: использование view presenter класса.

3. использование public static $dates = ['updated_at', 'created_at']; в вашей модели создаст эти поля Carbon по умолчанию, поэтому внутри ваших getXXXAttribute() методов вы вводите только return $this->updated_at->format('Y-m-d')

4. Это зависит от модели. Интересно, существует ли глобальный (основанный на конфигурации) подход?

5. Это зависит от модели, но если у вас есть родительская модель, которая расширяет eloquent model, вы можете сделать это легко.

Ответ №2:

 {{ $post->created_at }}
  

вернет ‘2014-06-26 04:07:31’

Решение таково

 {{ $post->created_at->format('Y-m-d') }}
  

Комментарии:

1. Спасибо. для предоставления того, который работает в блейде. Должен был знать, что ошибка не была выдана при прямом использовании свойства из-за метода __toString .

2. Это форматирование дат по отдельности, но спрашивающий попросил изменить формат по умолчанию, а не для отдельного использования блейда.

Ответ №3:

Laravel 4.x и 5.0

Чтобы изменить время в базе данных, используйте: http://laravel.com/docs/4.2/eloquent#timestamps

Предоставление пользовательского формата временной метки

Если вы хотите настроить формат ваших временных меток, вы можете переопределить метод getDateFormat в вашей модели:

 class User extends Eloquent {

    protected function getDateFormat()
    {
        return 'U';
    }

}
  

Laravel 5.1

https://laravel.com/docs/5.1/eloquent

Если вам нужно настроить формат ваших временных меток, установите свойство $DateFormat в вашей модели. Это свойство определяет, как атрибуты даты хранятся в базе данных, а также их формат, когда модель сериализуется в массив или JSON:

 class Flight extends Model
{
    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
    protected $dateFormat = 'U';
}
  

Комментарии:

1. Вы также можете просто установить protected $dateFormat = 'U';

2. Я думаю, что это существует только в более новых версиях Laravel, но я обновлю ответ, чтобы отметить это.

3. В Laravel 5.6 $dateFormat является общедоступным

4. @Daniel Похоже, что он все еще защищен для меня: github.com/illuminate/database/blob/5.6/Eloquent/Concerns/… Можете ли вы указать, где это общедоступно?

5. @Loren laravel.com/docs/5.6/upgrade ( This getDateFormat method is now public instead of protected. )

Ответ №4:

Вы также можете попробовать так.

 Use CarbonCarbon;


$created_at = "2014-06-26 04:07:31";

$date = Carbon::parse($created_at);

echo $date->format("Y-m-d");
  

Ответ №5:

Вы могли бы использовать

 protected $casts = [
    'created_at' => "datetime:Y-m-dTH:iPZ",
];
  

в вашем классе модели
или в любом формате по этой ссылке https://www.php.net/manual/en/datetime.format.php

Ответ №6:

Если кто-то ищет простое решение в Laravel 5.3:

  1. Пусть значение по умолчанию timestamps() будет сохранено как есть, т.е. ‘2016-11-14 12:19:49’

  2. В ваших представлениях отформатируйте поле, как показано ниже (или по мере необходимости):

      date('F d, Y', strtotime($list->created_at))
      

Ответ №7:

В laravel 6 последнюю версию можно легко добавить в «APP/user.php » модель:

 /**
 * The storage format of the model's date columns.
 *
 * @var string
 */
protected $dateFormat = 'U';
  

И в схеме можно добавить

     $table->integer('created_at')->nullable();
    $table->integer('updated_at')->nullable();
  

Ответ №8:

Используйте CarbonCarbon;

 $targetDate =  "2014-06-26 04:07:31";
Carbon::parse($targetDate)->format('Y-m-d');
  

Ответ №9:

Для новых версий laravel вам просто нужно объявить его в своей модели, например:

 class Your_class_name extends Model {

    protected $dateFormat = 'Y-m-d';

    ...


}
  

Ответ №10:

Самый простой способ — просто сделать это непосредственно в блейд-файле

 $post->created_at->format('Y-m-d')
  

Ответ №11:

Кастинг — это правильный способ сделать это в Laravel 9 и независимо от вашего интерфейса; blade, vue, react… переменные будут обработаны должным образом.

 /**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'created_at' => 'datetime:Y-m-d',
    'updated_at' => 'datetime:Y-m-d',
    'json' => 'object',
    'active' => 'boolean',
];
  

https://laravel.com/docs/9.x/eloquent-mutators#date-casting

Ответ №12:

LARAVEL 9 ^

в вашей модели добавьте это.

 use CarbonCarbon;

protected $dates = ['created_at','updated_at'];

protected function serializeDate(DateTimeInterface $dates)
{
    //return Carbon::createFromFormat('Y-m-d H:i:s', $dates)->diffForHumans();
    OR
    //return Carbon::createFromFormat('Y-m-d H:i:s', $dates)->format('Y-m-d');
}