-
-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Dates
github-actions[bot] edited this page Jul 16, 2026
·
1 revision
CloudCastle\Support\Dates — хелперы даты и времени поверх DateTimeImmutable:
fail-safe разбор, PSR-20-совместимое «сейчас», человекочитаемые интервалы
с грамматически точными русскими счётными формами, границы периодов и предикаты.
Лёгкая альтернатива Carbon: без макросов, локалей-переводов и мутабельности —
и в 19 раз быстрее в diffHuman (см. Сравнение).
-
parse($value, $timezone)— разбор строки с исключениемInvalidDateExceptionвместо тихогоfalse;fromFormat($format, $value)— строгий разбор по формату;fromTimestamp($timestamp)— из Unix-времени с микросекундами. -
useClock(?ClockInterface $clock)— подмена источника времени (PSR-20): заморозка «сейчас» в тестах без глобальных моков; совместимо сcloudcastle/clock. -
now($timezone)— текущий момент из подменённых или системных часов. -
diffHuman($moment, $other, $language)— «5 минут назад», «через 21 час», «только что»: русские счётные формы согласуются словарной грамматикойcloudcastle/inflector(«3 дня», «5 месяцев», «2 недели»), английские — правилами плюрализации. Никаких таблиц переводов иext-intl. - Предикаты
isWeekend/isToday/isFuture/isPast. - Границы
startOfDay/endOfDay/startOfMonth/endOfMonth;diffInDays($a, $b)— знаковая календарная разница.
use CloudCastle\Support\Dates;
use CloudCastle\Inflector\Language;
// fail-safe разбор: исключение вместо false
$moment = Dates::parse('2026-01-15 10:30:00', 'Europe/Moscow');
Dates::parse('мусор'); // InvalidDateException
// PSR-20: заморозка времени в тестах
Dates::useClock(new FrozenClock('2026-07-16 12:00:00'));
Dates::now(); // всегда 2026-07-16 12:00:00
// интервалы с русской грамматикой
Dates::diffHuman($fiveMinutesAgo); // '5 минут назад'
Dates::diffHuman($inTwentyOneHour); // 'через 21 час'
Dates::diffHuman($threeDaysAgo); // '3 дня назад' — не «3 дней»!
Dates::diffHuman($past, null, Language::English); // '5 minutes ago'
// границы и предикаты
Dates::startOfMonth($moment); // 2026-01-01 00:00:00
Dates::isWeekend(Dates::parse('2026-07-18')); // true (суббота)
Dates::diffInDays($earlier, $later); // 15 (знаковое)| Аспект | Dates | nesbot/carbon | nette/utils |
|---|---|---|---|
| Русская грамматика интервалов | ✅ словарная | ❌ | |
| PSR-20 подмена «сейчас» | ✅ | ❌ | |
| Иммутабельность | ✅ всегда | ||
| Разбор: fail-safe исключение | ✅ | ✅ | |
Скорость diffHuman
|
~263K ops/s | ~14K ops/s | — |
-
Fail-safe разбор: мусор на входе — типизированное исключение с сохранённой
причиной, а не
false, ползущее по коду. - Тестируемое время: PSR-20 подмена убирает недетерминизм «сейчас» из критичной логики (сроки платежей, окна идемпотентности).
- Вывод
diffHumanстроится только из словарных форм и чисел — ввод не эхо-копируется.
CloudCastle Support · · PHP 8.1+
GitHub · Packagist · Releases · Discussions
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)