Lorsque je travaille avec des API non conventionnelles, j'obtiens parfois un retour un peu désordonné au lieu d'un format de date bien défini. J'utilise donc une classe plutôt inélégante et j'admets volontiers qu'elle est brutale et non conventionnelle dans son principe, mais elle me fait du bien parfois ^^.
class DateHelper
{
private const DATE_FORMATS = [
DATE_ATOM,
DATE_COOKIE,
DATE_RFC822,
DATE_RFC850,
DATE_RSS,
DATE_W3C,
"Y-m-d\TH:i:s.u",
'Y-m-d\TH:i:s',
"Y-m-d'T'H:i:s.SSS'Z'",
"Y-m-d\TH:i:s.uP",
"Y-m-d\TH:i:sP",
"d/m/Y H:i:s",
];
/**
* @param string $inputStringDate
* @return DateTime|null
*/
public static function createDateFromUnknownFormat(string $inputStringDate): ?DateTime
{
$inputStringDate = str_replace('/', '-', $inputStringDate);
preg_match('/^(\d{4})\-(\d{2})-(\d{2})$/', $inputStringDate, $result);
if (!empty($result)) {
return DateTime::createFromFormat('Y-m-d', $inputStringDate);
}
preg_match('/^(\d{2})\-(\d{2})-(\d{4})$/', $inputStringDate, $result);
if (!empty($result)) {
return DateTime::createFromFormat('d-m-Y', $inputStringDate);
}
foreach (self::DATE_FORMATS as $dateFormat) {
if ($dateObject = DateTime::createFromFormat($dateFormat, $inputStringDate)) {
return $dateObject;
}
}
return null;
}
}