Как отформатировать диапазон дат с помощью PHP Carbon? - PullRequest
1 голос
/ 31 октября 2019

Есть ли в PHP Carbon встроенный метод для форматирования диапазона дат, подобный следующему?

$start_date = '2020-05-20';
$end_date = '2020-05-30';

// expected output 'May 20th-30th, 2020'

$start_date = '2019-10-24';
$end_date = '2019-11-02';

// expected output 'October 24th-November 2nd, 2019'

$start_date = '2019-12-25';
$end_date = '2020-01-03';


// expected output 'Desember 25th, 2019 - January 3rd, 2020'

или я должен написать собственную логику для достижения этой цели?

Ответы [ 4 ]

0 голосов
/ 31 октября 2019

Если варианты форматов для 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 .

0 голосов
/ 31 октября 2019

Вы можете сделать это так,

        function date_period_format($period_start,$period_end){

            $period_start = date_create_from_format("Y-m-d",$period_start);
            $period_end = date_create_from_format("Y-m-d",$period_end);
            if($period_end->format("Y m") == $period_start->format("Y m")){
                return $period_start->format("F jS") . "-" . $period_end->format("jS, Y");
            }elseif($period_end->format("Y") == $period_start->format("Y")){
                return $period_start->format("F jS") . "-" . $period_end->format("F jS, Y");
            }else{
                return $period_start->format("F jS, Y") . " - " . $period_end->format("F jS, Y");
            }
        }
        echo date_period_format('2020-05-20', '2021-05-30');

0 голосов
/ 31 октября 2019
$start_date = '2019-12-25';
$end_date = '2020-01-03';


// expected output 'Desember 25th, 2019 - January 3rd, 2020'
$startDateTime = \DateTime::createFromFormat("Y-m-d", $start_date);
$endDateTime =  \DateTime::createFromFormat("Y-m-d", $end_date);
$result = ($startDateTime->format("F jS, Y"))." - ".($endDateTime->format("F jS, Y"));
echo $result;

$start_date = '2019-10-24';
$end_date = '2019-11-02';

// expected output 'October 24th-November 2nd, 2019'
$startDateTime = \DateTime::createFromFormat("Y-m-d", $start_date);
$endDateTime =  \DateTime::createFromFormat("Y-m-d", $end_date);
$result = ($startDateTime->format("F jS"))."-".($endDateTime->format("F jS, Y"));
echo $result;

$start_date = '2020-05-20';
$end_date = '2020-05-30';

// expected output 'May 20th-30th, 2020'
$startDateTime = \DateTime::createFromFormat("Y-m-d", $start_date);
$endDateTime =  \DateTime::createFromFormat("Y-m-d", $end_date);
$result = ($startDateTime->format("F jS"))."-".($endDateTime->format("jS, Y"));
echo $result;
0 голосов
/ 31 октября 2019

Ну, я до сих пор придумал этого помощника. Я публикую это на всякий случай, если кто-то посчитает это полезным.

function date_range_string(\Carbon\Carbon $start_date, \Carbon\Carbon $end_date)
{
    if ($end_date->lessThan($start_date)) {
        throw new InvalidArgumentException('End date must be greater than start date');
    }

    $date_format = 'F jS, Y';

    $start_date_format = $date_format;
    $end_date_format = $date_format;

    if ($start_date->year == $end_date->year) {
        $start_date_format = 'F jS';

        if ($start_date->month == $end_date->month) {
            $end_date_format = 'jS, Y';

            if ($start_date->day == $end_date->day) {
                return $start_date->format($date_format);
            }
        }
    }

    return $start_date->format($start_date_format) . '-' . $end_date->format($end_date_format);
}
...