Если варианты форматов для DateTime хранятся в массивах, их можно легко поменять местами, например, для других языков.
function strDateRange($start, $end, $formats = null){
$formats = $formats ?? [
'' => ['F jS, Y','F jS, Y'], //default
'Y' => ['F jS','F jS, Y'], //years equal
'Ym' => ['F jS','jS, Y'], //years and month equal
];
foreach($formats as $key => $curFormat){
if($key == "" OR $start->format($key) == $end->format($key)){
$format = $curFormat;
}
}
return $start->format($format[0])."-".$end->format($format[1]);
}
Тест:
echo strDateRange(date_create('2019-04-20'), date_create('2019-04-30'))."<br>\n";
echo strDateRange(date_create('2019-04-20'), date_create('2019-05-30'))."<br>\n";
echo strDateRange(date_create('2019-04-20'), date_create('2020-05-30'))."<br>\n";
Вывод:
April 20th-30th, 2019
April 20th-May 30th, 2019
April 20th, 2019-May 30th, 2020
Примечание: функция принимает также все расширения из DateTime, как Carbon и dt .