Вопрос:

PHP Carbon, получить все даты в диапазоне дат?

php php-carbon

38132 просмотра

9 ответа

676 Репутация автора

Как я могу получить все даты между двумя датами в PHP? Предпочитаю использовать Carbon для дат.

$from = Carbon::now();
$to = Carbon::createFromDate(2017, 5, 21);

Я хочу иметь все даты между этими двумя датами .. Но как? Можно только найти решения, используя функцию strtotime.

Автор: user1469734 Источник Размещён: 06.08.2015 07:24

Ответы (9)


17 плюса

182786 Репутация автора

Так как Carbon является расширением встроенного в PHP DateTime, вы должны иметь возможность использовать DatePeriod и DateInterval точно так же, как если бы вы использовали объект DateTime.

$interval = new DateInterval('P1D');
$to->add($interval);
$daterange = new DatePeriod($from, $interval ,$to);

foreach($daterange as $date){
    echo $date->format("Ymd"), PHP_EOL;
}

РЕДАКТИРОВАТЬ

Если вам нужно включить конечную дату периода, вам нужно немного ее изменить и откорректировать $toперед генерацией DatePeriod.

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($from, $interval ,$to);

foreach($daterange as $date){
    echo $date->format("Ymd"), PHP_EOL;
}
Автор: Mark Baker Размещён: 06.08.2015 07:32

3 плюса

1585 Репутация автора

Вот что у меня есть:

private function getDatesFromRange($date_time_from, $date_time_to)
    {

        // cut hours, because not getting last day when hours of time to is less than hours of time_from
        // see while loop
        $start = Carbon::createFromFormat('Y-m-d', substr($date_time_from, 0, 10));
        $end = Carbon::createFromFormat('Y-m-d', substr($date_time_to, 0, 10));

        $dates = [];

        while ($start->lte($end)) {

            $dates[] = $start->copy()->format('Y-m-d');

            $start->addDay();
        }

        return $dates;
    }

Пример:

$this->getDatesFromRange('2015-03-15 10:10:10', '2015-03-19 09:10:10');
Автор: Darius.V Размещён: 10.09.2015 11:37

59 плюса

2842 Репутация автора

Вот как я это сделал с Carbon

private function generateDateRange(Carbon $start_date, Carbon $end_date)
{
    $dates = [];

    for($date = $start_date->copy(); $date->lte($end_date); $date->addDay()) {
        $dates[] = $date->format('Y-m-d');
    }

    return $dates;
}
Автор: Sebastian Sulinski Размещён: 26.01.2016 06:25

9 плюса

967 Репутация автора

Основываясь на ответе Марка Бейкера, я написал эту функцию:

/**
 * Compute a range between two dates, and generate
 * a plain array of Carbon objects of each day in it.
 *
 * @param  \Carbon\Carbon  $from
 * @param  \Carbon\Carbon  $to
 * @param  bool  $inclusive
 * @return array|null
 *
 * @author Tristan Jahier
 */
function date_range(Carbon\Carbon $from, Carbon\Carbon $to, $inclusive = true)
{
    if ($from->gt($to)) {
        return null;
    }

    // Clone the date objects to avoid issues, then reset their time
    $from = $from->copy()->startOfDay();
    $to = $to->copy()->startOfDay();

    // Include the end date in the range
    if ($inclusive) {
        $to->addDay();
    }

    $step = Carbon\CarbonInterval::day();
    $period = new DatePeriod($from, $step, $to);

    // Convert the DatePeriod into a plain array of Carbon objects
    $range = [];

    foreach ($period as $day) {
        $range[] = new Carbon\Carbon($day);
    }

    return ! empty($range) ? $range : null;
}

Использование:

>>> date_range(Carbon::parse('2016-07-21'), Carbon::parse('2016-07-23'));
=> [
     Carbon\Carbon {#760
       +"date": "2016-07-21 00:00:00.000000",
       +"timezone_type": 3,
       +"timezone": "UTC",
     },
     Carbon\Carbon {#759
       +"date": "2016-07-22 00:00:00.000000",
       +"timezone_type": 3,
       +"timezone": "UTC",
     },
     Carbon\Carbon {#761
       +"date": "2016-07-23 00:00:00.000000",
       +"timezone_type": 3,
       +"timezone": "UTC",
     },
   ]

Вы также можете передать логическое значение ( false) в качестве третьего аргумента, чтобы исключить дату окончания.

Автор: Tristan Jahier Размещён: 22.07.2016 08:14

2 плюса

21 Репутация автора

Вы не можете использовать переменную управления циклом напрямую, следующая должна работать нормально

$start = Carbon::today()->startOfWeek();
$end = Carbon::today()->endOfWeek();

$stack = [];

$date = $start;
while ($date <= $end) {

    if (! $date->isWeekend()) {
        $stack[] = $date->copy();
    }
    $date->addDays(1);
}

return $stack;
Автор: marcelo gutierrez Размещён: 16.10.2017 08:25

3 плюса

11498 Репутация автора

Это также можно сделать так:

new DatePeriod($startDate, new DateInterval('P1D'), $endDate)

Просто имейте в виду, что DatePeriodэто итератор, поэтому, если вам нужен реальный массив:

iterator_to_array(new DatePeriod($startDate, new DateInterval('P1D'), $endDate))

Используя Laravel, вы всегда можете создать макрос Carbon:

Carbon::macro('range', function ($start, $end) {
    return new Collection(new DatePeriod($start, new DateInterval('P1D'), $end));
});

Теперь вы можете сделать это:

foreach (Carbon::range($start, $end) as $date) {
   // ...
}
Автор: Jonathan Размещён: 25.11.2017 12:18

43 плюса

1223 Репутация автора

Решение

Начиная с Carbon 1.29 возможно:

$period = CarbonPeriod::create('2018-06-14', '2018-06-20');

// Iterate over the period
foreach ($period as $date) {
    echo $date->format('Y-m-d');
}

// Convert the period to an array of dates
$dates = $period->toArray();

Для получения более подробной информации см. Документацию: https://carbon.nesbot.com/docs/#api-period .

Автор: Paul Размещён: 14.06.2018 09:52

2 плюса

73 Репутация автора

Вы можете напрямую использовать Carbon

    $start = Carbon::createFromDate(2017, 5, 21);
    $end = Carbon::now();

    while($start < $end){
        echo $start->format("M");
        $start->addMonth();
    }
Автор: latecoder Размещён: 01.10.2018 10:45

0 плюса

26 Репутация автора

//To get just an array of dates, follow this.


        $period = CarbonPeriod::create('2018-06-14', '2018-06-20');

        $p = array();
    // If you want just dates
    // Iterate over the period and create push to array
        foreach ($period as $date) {
            $p[] = $date->format('Y-m-d');
        }

    // Return an array of dates

        return $p;
Автор: Jawad Multani Размещён: 13.06.2019 04:50
Вопросы из категории :
32x32