Date being recorded wrong in m-d-Y bank instead of Y-m-d

Asked

Viewed 1,735 times

3

I set the date format for viewing to "d-m-Y", while the recording format is from the "Y-m-d" bank".

However at the time of recording in the database, something happens and the data is going in the "m-d-Y" format, and with this the data will be truncated, especially if the day is bigger than 12, then the date goes to 31-12-1969 automatically and it is this date that is recorded in the database.

Laravel 4.1 is installed, and the database is Mysql.

Here are the codes:

controller

public function getEdit($id) {

    $despesa = Despesas::find($id);
    $despesa->valor = str_replace('.', ',', $despesa->valor);

    $despesasOrigem = array('' => 'Selecione...') + DespesasOrigem::lists('descricao', 'id');
    $despesasTipos = array('' => 'Selecione...') + DespesasTipo::lists('descricao', 'id');

    return View::make('despesas.despesasEdit')
        ->with('despesa', $despesa)
        ->with('despesas_tipo_id', $despesasTipos)
        ->with('despesas_origem_id', $despesasOrigem);
}

public function postEdit() {

    $dados = Input::all();

    $dados['data'] = date('Y/m/d', strtotime($dados['data']));
    $dados['users_id'] = Auth::User()->id;

    $valida = Validator::make($dados, Despesas::$rules);

    if ($valida->fails()) {

        return Redirect::to('despesas/edit' . Input::get('id') )->withInput()->withErrors($valida);

    } else {

        $despesa = Despesas::find(Input::get('id'));
        $despesa->descricao = $dados['descricao'] ;
        $despesa->data = $dados['data'] ;
        $despesa->valor = $str_replace(',', '.', $dados['valor']);
        $despesa->users_id = $dados['users_id'] ;
        $despesa->despesas_tipo_id = $dados['despesas_tipo_id'] ;
        $despesa->despesas_origem_id = $dados['despesas_origem_id'] ;

        $despesa->save();

        $despesa = Despesas::find($despesa->id);
        $despesasOrigem = array('' => 'Selecione...') + DespesasOrigem::lists('descricao', 'id');
        $despesasTipos = array('' => 'Selecione...') + DespesasTipo::lists('descricao', 'id');

        return View::make('despesas.despesasEdit')
            ->with('despesa', $despesa)
            ->with('despesas_tipo_id', $despesasTipos)
            ->with('despesas_origem_id', $despesasOrigem)
            ->with('sucesso', 'Despesa atualizada com sucesso!');

    }
}

view

@extends('templates.master')

@section('conteudo')

<h2>Editar Despesa</h2>

@if(isset($sucesso))
  {{ Alert::success($sucesso) }}
@endif

{{ Form::open() }}

  {{ Form::hidden('id', $despesa->id) }}

  {{ Form::label('Descrição') }}
  {{ Form::input('text', 'descricao', $despesa->descricao) }}
  @if($errors->first('descricao') != null)
    {{ Alert::warning($errors->first('descricao', 'O campo descrição é obrigatorio.'))}}
  @endif

  {{ Form::label('Valor') }}
  {{ Form::input('text', 'valor', $despesa->valor) }}
  @if($errors->first('valor') != null)
    {{ Alert::warning($errors->first('valor', 'O campo valor é obrigatório'))}}
  @endif

  {{ Form::label('Data da despesa') }}
  {{ Form::input('text', 'data', date('d/m/Y', strtotime($despesa->data))) }}    
  @if($errors->first('data') != null)
    {{ Alert::warning($errors->first('data', 'O campo data é obrigatório'))}}
  @endif

  {{ Form::label('despesas_tipo_id', 'Tipo:') }}
  {{ Form::select('despesas_tipo_id', $despesas_tipo_id, $despesa->despesas_tipo_id) }}
  @if($errors->first('despesas_tipo_id') != null)
    {{ Alert::warning($errors->first('despesas_tipo_id', 'O campo Tipo de Despesa é obrigatório'))}}
  @endif

  {{ Form::label('despesas_origem_id', 'Origem:') }}
  {{ Form::select('despesas_origem_id', $despesas_origem_id, $despesa->despesas_origem_id) }}
  @if($errors->first('despesas_origem_id') != null)
    {{ Alert::warning($errors->first('despesas_origem_id', 'O campo Origem da Despesa é obrigatório'))}}
  @endif

  {{ Form::submit('Enviar')}}

{{ Form::close() }}

@stop

route

Route::controller('despesas', 'DespesasController');

models

<?php

class Despesas extends Eloquent {

    protected $table = "despesas";

    protected $softDelete = true;

    /**
     * Regras de validação da table despesas 
     *
     * @return array
     */
    public static $rules = array (
        'descricao'             => 'required',
        'valor'                 => 'required|numeric',
        'data'                  => 'required|date',
        'despesas_tipo_id'      => 'required',
        'despesas_origem_id'    => 'required',
        'users_id'              => 'required'
        );

     protected $guarded = array('id');


    public function despesasTipo()
    {
        return $this->belongsTo('DespesasTipo','despesas_tipo_id');
    }

    public function despesasOrigem()
    {
        return $this->belongsTo('DespesasOrigem','despesas_origem_id');
    }

    public function user()
    {
        return $this->belongsTo('User','users_id');
    }

}

2 answers

8


In your controller, in the method postEdit(), change this line:

$dados['data'] = date('Y/m/d', strtotime($dados['data']));

For this:

$dados['data'] = DateTime::createFromFormat('d/m/Y', $dados['data'])->format('Y-m-d');


In your view, you could also use the class DateTime. In place of:

{{ Form::input('text', 'data', date('d/m/Y', strtotime($despesa->data))) }}

You could use:

{{ Form::input('text', 'data', with(new DateTime($despesa->data))->format('d/m/Y') }}

Even better than that, you can define, in your model, fields that will be treated as date, through the protected property $dates, so that the fields listed in it will extend the Carbon object, which allows using the method format() directly:

class Despesas extends Eloquent
{
    /* ... */

    protected $dates = array('data');

    /* ... */
}

Doing this, in yours view, the presentation would look like this:

{{ Form::input('text', 'data', $despesa->data->format('d/m/Y') }}
  • Thanks, it worked well on my controller like this: $dados['data'] = DateTime::createFromFormat('d/m/Y', $dados['data']);&#xA;&#xA; $dados['data'] = $dados['data']->format('Y/m/d');

  • 1

    @By all means! That syntax works with the latest versions of PHP. In your case the helper with() of Laravel helps simplify: $dados['data'] = with(DateTime::createFromFormat('d/m/Y', $dados['data']))->format('Y-m-d'); :)

0

I have used HTML5’s "date" attribute that 2 advantages:

  1. No need to convert to show on screen, because HTML5 makes automatic.
  2. Brings a calendar for the user to choose the date using the mouse.

In this case it is enough:

{{ Form::input('date', 'data', $despesa->data) }}

Simple as that !

  • However, support currently seems to be limited to Chrome and Opera: http://caniuse.com/#feat=input-datetime

Browser other questions tagged

You are not signed in. Login or sign up in order to post.