Определение формата даты для Carbon::createFromDate

#php #date #datetime #format #php-carbon

#php #Дата #дата и время #формат #php-carbon

Вопрос:

У меня есть вызов API, который возвращает дату в различных форматах. Я написал блок try … catch, чтобы попробовать Carbon ::parse и Carbon ::createFromDate с несколькими форматами, которые, кажется, работают, но я чувствую, что должен быть лучший способ сделать это.

Вот два возможных формата даты:
2020-09-24T00:00.000Z
24/09/20 00:00:00

И вот код, который у меня есть

 // Test different date formats
$formats = ['d/m/y H:i:s', 'Y-m-d'];
$dateObj = null;

foreach ($formats as $format) {
    try {
        if ($dateObj = Carbon::createFromFormat($format, $date)) {
            break;
        }
    } catch (InvalidArgumentException $e) {
        $error = 'invalid date';
    }
    try {
        if ($dateObj = Carbon::parse($date)) {
            break;
        }
    } catch (InvalidArgumentException $e) {
        $error = 'invalid date';
    }
}
  

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

1. Делайте это только с помощью createFromFormat . Однако в массиве должны быть все возможные форматы. С помощью Carbon :: parse могут быть получены неправильные результаты. Это сложная работа. Информация о других форматах отсутствует, чтобы можно было сказать больше.

Ответ №1:

Carbon::parse() точно создан для анализа различных форматов (он использует DateTime собственный конструктор), и вы можете положиться на него, чтобы понять более распространенные форматы. createFromFormat() на самом деле требуется только тогда, когда у вас есть точное ожидание или для получения приоритета при наличии двусмысленности. Например 1/2 , по умолчанию анализируется по-американски (2 января), чтобы получить 1 февраля, здесь уместно сначала попробовать createFromFormat() с конкретными d/m форматами, но другого parse() может быть достаточно. В вашем примере d/m/y H:i:s действительно необходимо указать, иначе порядок будет неправильным (и вы можете использовать * вместо пробела, чтобы T это тоже работало), но Y-m-d бесполезно, parse() обрабатывайте это правильно.

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

1. Спасибо. Я удалил Y-m-d из массива форматов, и он работает до сих пор. Возможно, мне придется добавить другие форматы дат, но, надеюсь, это только те два.