🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CalendarPeriod — итерация календарного периода
Назначение
Ленивый период дат с шагом (TimeSpan, DateInterval или строка вида 1 month): генератор отдаёт CalendarDate по одной, не материализуя весь диапазон. Паритет с CarbonPeriod.
Для чего и как применять
Календари, графики платежей, отчёты по дням/неделям/месяцам: CalendarPeriod::between($from, $to, '1 week'), границы — excludingStart()/excludingEnd(), проверка — contains().
Пример
$period = CalendarPeriod::between(
new DateTimeImmutable('2026-01-01'),
new DateTimeImmutable('2026-03-01'),
'1 month',
)->excludingEnd();
foreach ($period as $date) {
echo $date->format('Y-m-d'); // 2026-01-01, 2026-02-01
}
count($period); // 2
Анти-паттерны
Шаг, не продвигающий дату вперёд (ноль или отрицательный), отклоняется типизированным исключением — бесконечный цикл невозможен. Для миллионов точек предпочитайте foreach вместо toArray().
Жизненный цикл
stateDiagram-v2
[*] --> Configured: between(start, end, step)
Configured --> Configured: excludingStart() / excludingEnd()
Configured --> Iterating: foreach / count / toArray
Iterating --> Iterating: yield CalendarDate, advance(step)
Iterating --> Failed: step does not progress
Iterating --> [*]: date passes end
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Ленивая итерация генератором | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Шаг TimeSpan / DateInterval / строка | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Управление включением границ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Защита от непродвигающегося шага | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Иммутабельная конфигурация периода | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Всего | 🏆 5 | 0 | 4 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano