Использование Carbon для создания нескольких дат с интервалом в диапазоне, но только в будущем.Php

Кемеровские программисты php общаются здесь
Ответить
Гость
 Использование Carbon для создания нескольких дат с интервалом в диапазоне, но только в будущем.

Сообщение Гость »

Мне нужно создать несколько дат между двумя датами на основе интервала (например, еженедельно, каждые 2 недели, ежемесячно и т. д.), но мне нужны только те даты, которые будут в будущем.
Для этого я использую библиотеку Carbon 2.72.3 и получил следующий код:

Код: Выделить всё

$interval = CarbonInterval::week();
$startDate = Carbon::create(2024, 3, 17);
$endDate = Carbon::create(2024, 4, 1);
$amount = 4;

$period = CarbonPeriod::interval($interval)
->setStartDate($startDate)
->addFilter(fn(Carbon $carbon) => $carbon->isFuture(), 'isFuture')
->addFilter(fn(Carbon $carbon) => !$endDate || $carbon->isBefore($endDate))
->setRecurrences($amount);

dd($period->toArray());
К сожалению, иногда это работает (то есть: не со всеми датами/интервалами), и я не могу точно сказать, при каких условиях это работает, а когда нет.
При указанных выше датах Carbon выдает исключение Carbon\Exceptions\UnreachableException с сообщением «Не удалось найти следующую допустимую дату».. Если я уменьшу сумму до 1, это сработает, но вернет в качестве даты только 24 марта 2024 г. (которая тогда ожидается, но не решает мою проблему).
С другими данных, таких как этот, он работает так, как ожидалось: возвращает 4 даты в соответствии с интервалом относительно начальной даты, но только те, которые находятся в будущем.

Код: Выделить всё

$interval = CarbonInterval::month();
$startDate = Carbon::create(2022, 6, 2);
$endDate = null;
$amount = 4;
Если я установлю $endDate = Carbon::create(2024, 4, 1);, он также перестанет работать. Я подозреваю, что это иногда случается, когда он не может сгенерировать $amount дат. Но, похоже, это не всегда так, поскольку следующая настройка должна иметь возможность генерировать как минимум 4 даты, хотя выдается одно и то же исключение:

Код: Выделить всё

$interval = CarbonInterval::year();
$startDate = Carbon::create(2022, 6, 2);
$endDate = Carbon::create(2028, 4, 1);
$amount = 4;
Ожидаемые даты:
  • 2024-06-02
  • 2025- 02.06
  • 02.06.2026
  • 02.06.2027
Хотя в данном случае это работает, только если я устанавливаю дату окончания на 01 апреля 2029 г., что для меня не имеет смысла, поскольку последняя дата уже в 2027 г.>

Подробнее здесь: https://stackoverflow.com/questions/781 ... ut-only-on
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»