Исключение Не удалось проанализировать строку времени - PullRequest
1 голос
/ 28 мая 2020

Я посмотрел пару вопросов с похожим заголовком, но мой случай немного отличается. Я пытаюсь переместить данные из одной таблицы в другую, используя задачу laravel. Таблица, из которой я хочу скопировать данные, использует varchar для date, тогда как таблица, в которую я копирую, имеет тип столбца date. Поэтому я должен преобразовать строку в действительную дату углерода перед вставкой в ​​новую таблицу. К сожалению, в старой таблице даты смешаны в другом формате, поэтому я должен проверить и преобразовать перед вставкой, но я продолжаю получать эту ошибку при работе с конкретным строковым форматом

Exception: DateTime :: __ construct () : Не удалось проанализировать строку времени (26.02.1991) в позиции 0 (2): Неожиданный символ

Вот как выглядит мой код для преобразования строк в формат даты

if ($user->profile->date_of_birth === null) {  
    $dob = null;
    Log::info([$user->profile->date_of_birth, $dob]);
} else if (Carbon::parse($user->profile->date_of_birth)->toDateString() == true) {

    $dob = Carbon::parse($user->profile->date_of_birth)->toDateString();
    Log::info([$user->profile->date_of_birth, $dob]);
} else if (Carbon::createFromFormat('d/m/Y',   $user->profile->date_of_birth)->format('Y-m-d') == true) {

    $formattedDate = Carbon::createFromFormat('d/m/Y', $user->profile->date_of_birth)->format('Y-m-d');
    $dob = Carbon::parse($formattedDate)->toDateString();
    Log::info([$user->profile->date_of_birth, $dob]);
}

Используя ремесленник laravel, я действительно могу преобразовать строку в формат даты, как показано здесь enter image description here

Почему я продолжаю получать сообщение об ошибке когда я запускаю свою задачу и обнаруживаю именно эту строку?

Ответы [ 3 ]

1 голос
/ 28 мая 2020

В Carbon, Carbon::parse('26/02/1991') не поддерживает этот формат. Углерод рассматривает это как ('m / d / Y'). Вот почему вы получаете сообщение об ошибке, когда хотите его проанализировать и преобразовать в toDateString. Я думаю, вы можете изменить свой формат $dob перед синтаксическим анализом, тогда он должен работать.

// Error
Carbon::parse('26/02/1991')->toDateString() // Error: DateTime::__construct(): Failed to parse time string (20/02/1995) at position 0 (2): Unexpected character

// Solve
Carbon::parse('02/26/1991')->toDateString() // "1991-02-26"

Вам нужно изменить формат столбца date_of_birth в модели Profile. Так что просто добавьте аксессуар на вашу модель Profile, например,

public function getDateOfBirthAttribute()
{
    [$day, $month, $year] = explode('/', $this->date_of_birth);
    return implode('/', [$month, $day, $year]);
}

. Теперь, когда вы вызываете $user->profile->date_of_birth, он вызовет аксессуар и получит желаемый формат, который поможет при синтаксическом анализе в Carbon.

0 голосов
/ 28 мая 2020

Используйте ::createFromFormat('d/m/Y'...) вместо ::parse(), как вы делали в других местах.

Но похоже, что ->profile - это объект БД, поэтому я настоятельно рекомендую не обрабатывать ->date_of_birth как строка, вы должны сохранить ее как экземпляры Carbon, добавив ее в поля $dates вашей модели; затем используйте createFromFormat только тогда, когда вы получаете ввод от пользователя.

0 голосов
/ 28 мая 2020

Я думаю, что это ваш

else if (Carbon::parse($user->profile->date_of_birth)->toDateString() == true)

Я бы вместо этого заключил это в try / catch. Если не удалось, попробуйте следующий.

...