unexpected parse missing invalidargumentexception found dates data convert php laravel format php-carbon

php - parse - Laravel Carbon Data missing



laravel seed invalidargumentexception data missing (4)

Necesita establecer protected $dateFormat en ''Ymd H:i '' en su modelo, consulte https://laravel.com/docs/5.2/eloquent-mutators#date-mutators

En mi modelo tengo lo siguiente:

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

Estoy usando un selector de fecha y hora para insertar las fechas de inicio y finalización, en este formato:

2016-01-23 22:00

Sin los segundos. Cuando lo hago así, obtengo este error:

InvalidArgumentException in Carbon.php line 425: Data missing at Carbon::createFromFormat(''Y-m-d H:i:s'', ''2016-01-23 22:00'') in Model.php line 3015

Si incluyo los segundos, funciona. Los segundos no son importantes para mí, y no quiero incluirlos en mis campos de selector de fecha y hora. De todos modos, ¿todavía puedo usar esos campos como campos de fecha?


Puede establecer $ dateFormat en su modelo como dice Christian, pero si no desea implicar los campos updated_at y created_at en la operación, puede usar los eventos para "corregir" el objeto datetime antes de guardarlo en la base de datos.

Aquí tiene el documento oficial al respecto: https://laravel.com/docs/5.2/eloquent#events



tl; dr

La cadena de fecha y el formato de fecha son diferentes, debe cambiar la cadena de formato o modificar la cadena de fecha para que coincidan.

Explicación

El problema

Este error surge cuando la función createFromFormat de Carbon recibe una cadena de fecha que no coincide con la cadena de formato pasada. Más precisamente, esto proviene de la función DateTime::createFromFormat , porque Carbon simplemente llama a eso:

public static function createFromFormat($format, $time, $tz = null) { if ($tz !== null) { $dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz)); } else { $dt = parent::createFromFormat($format, $time); // Where the error happens. } if ($dt instanceof DateTime) { return static::instance($dt); } $errors = static::getLastErrors(); throw new InvalidArgumentException(implode(PHP_EOL, $errors[''errors''])); // Where the exception was thrown. }

No hay suficientes datos

Si su cadena de fecha es "más corta" que la cadena de formato como en este caso:

Carbon::createFromFormat(''Y-m-d H:i:s'', ''2017-01-04 00:52'');

Carbono arrojará:

InvalidArgumentException en Carbon.php línea 425:
Datos faltantes

Demasiada información

Si su cadena de fecha es "más larga" que la cadena de formato como en este caso:

Carbon::createFromFormat(''Y-m-d H:i'', ''2017-01-02 00:27:00'');

Carbono arrojará:

InvalidArgumentException en Carbon.php línea 425:
Datos finales

Bajo el capó

De acuerdo con la documentación sobre mutadores, el formato de fecha predeterminado es: ''Ymd H:i:s'' . El procesamiento de la fecha ocurre en la función asDateTime del Modelo . En la última condición se getDateFormat función getDateFormat , de ahí viene el formato personalizado. El formato predeterminado se define en la clase de Grammar la base de datos .

Solución

Debe asegurarse de que la cadena de fecha coincida con la cadena de formato.

Cambiar la cadena de formato

Puede anular la cadena de formato predeterminada de esta manera:

class Event extends Model { protected $dateFormat = ''Y-m-d H:i''; }

Hay dos problemas con este enfoque:

  • Esto se aplicará a todos los campos definidos en la matriz $dates del modelo.
  • Tienes que almacenar los datos en este formato en la base de datos.

Edite y formatee las cadenas de fecha

Mi solución recomendada es que el formato de fecha sea el predeterminado ''Ymd H:i:s'' y debe completar las partes faltantes de la fecha, como esta:

public function store(Request $request) { $requestData = $request->all(); $requestData[''start_time''] .= '':00''; $requestData[''end_time''] .= '':00''; $event = new Event($requestData); $event->save(); }

Y cuando quiera usar la fecha, debe formatearla:

public function show(Request request, $eventId) { $event = Event::findOrFail($eventId); $startTime = $event->start_time->format(''Y-m-d H:i''); $endTime = $event->end_time->format(''Y-m-d H:i''); }

Por supuesto, los campos deben ser mutados a fechas:

class Event extends Model { protected $dates = [ ''start_time'', ''end_time'', ''created_at'', ''updated_at'', ''deleted_at'', ]; }