Intereting Posts
CakePHP: Неустранимая ошибка: допустимый размер памяти 536870912 байт исчерпан (пытался выделить 52 байта) Лучший способ случайного выбора пары ключей и значений из массива в PHP использование включает кросс-домен, содержащий php-код – сбой Установка CodeIgniter в корневом каталоге и WordPress в подкаталоге doctrine2: в двунаправленных отношениях «один ко многим», как сохранить с обратной стороны? Используйте AJAX для отображения генерируемого php изображения SSL-самоподписанные сертификаты для подключения к Mysql с PHP Как автоматизировать передачу данных в формате html? Zend_Form: записи базы данных в таблице HTML с флажками PHP слияния массивов в 2D JSON Динамически включать css или Js-файл, используя php overrideMimeType альтернатива для IE Показывать видеоролики YouTube только для пользователей сайта Как я могу прочитать метаданные PNG из PHP? Пустое содержимое потока PHP SSH2, даже с stream_set_blocking?

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

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

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

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

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

 private function generateDateRange(Carbon $start_date, Carbon $end_date) { $dates = []; for($date = $start_date; $date->lte($end_date); $date->addDay()) { $dates[] = $date->format('Ym-d'); } return $dates; } 

Поскольку Carbon является расширением встроенного в DateTime PHP, вы должны иметь возможность использовать 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; } - $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; } 

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

 /** * 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; } - /** * 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 ) в качестве третьего аргумента, чтобы исключить дату окончания.

Вот что я имею:

 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('Ym-d', substr($date_time_from, 0, 10)); $end = Carbon::createFromFormat('Ym-d', substr($date_time_to, 0, 10)); $dates = []; while ($start->lte($end)) { $dates[] = $start->copy()->format('Ym-d'); $start->addDay(); } return $dates; } 

Пример:

 $this->getDatesFromRange('2015-03-15 10:10:10', '2015-03-19 09:10:10'); 

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

 $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; - $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; 

Это также можно сделать следующим образом:

 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) { // ... }