#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 из массива форматов, и он работает до сих пор. Возможно, мне придется добавить другие форматы дат, но, надеюсь, это только те два.