-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Date point
github-actions[bot] edited this page Jul 14, 2026
·
1 revision
DateTimeImmutable, который берёт «сейчас» из глобальных часов приложения
и бросает типизированные исключения вместо false с warning-ом.
Функциональный аналог Symfony\Component\Clock\DatePoint.
use CloudCastle\Clock\Clock;
use CloudCastle\Clock\ClockHolder;
use CloudCastle\Clock\DatePoint;
use CloudCastle\Clock\MockClock;
ClockHolder::set(MockClock::from('2026-03-01 10:00:00', 'UTC'));
new DatePoint(); // 2026-03-01 10:00:00 — из часов приложения
new DatePoint('+1 hour'); // 11:00 — модификатор от «сейчас»
new DatePoint('now', 'Europe/Moscow'); // 13:00 московского
Clock::now('+30 minutes'); // шорткат фасада → DatePoint
DatePoint::createFromFormat('Y-m-d', '2026-05-05'); // исключение вместо false
DatePoint::fromInterface($anyDate); // снимок любого DateTimeInterface
(new DatePoint())->modify('+2 days'); // исключение на мусоре/NULflowchart LR
H[ClockHolder] -->|«сейчас»| DP[DatePoint]
MOD["'+1 hour' / строка"] --> DP
DP -->|валидация: NUL, date_parse| OK[Момент]
DP -->|мусор| EX[InvalidClockValueException]
sequenceDiagram
participant T as Тест
participant H as ClockHolder
participant D as DatePoint
T->>H: set(MockClock 10:00)
T->>D: new DatePoint('+1 hour')
D->>H: now()
H-->>D: 10:00 (виртуальные)
D-->>T: 11:00 — детерминированно
- Даты в бизнес-коде становятся тестируемыми без внедрения часов в каждый вызов.
- Ошибки разбора — типизированные исключения пакета, не
false+warning. - Микросекунды сохраняются при всех преобразованиях.
- Читает глобальный слот: в новом коде с DI предпочтительнее явные часы +
now().
- Миграция легаси с
new DateTimeImmutable()на управляемое время заменой класса.
-
new DatePoint()в цикле горячего пути — каждый вызов читает слот; вынесите момент в переменную.
| Возможность | Clock | symfony/clock | lcobucci/clock | beste/clock | nesbot/carbon | ergebnis/clock | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Момент от часов приложения | ✅ | ✅ | ❌ | ❌ | ❌ | Clock + symfony/clock | |
| Исключения вместо false | ✅ | ✅ | — | — | — | Clock + symfony/clock | |
| Отклонение NUL-байтов | ✅ | ❌ | — | — | ❌ | — | Clock |
CloudCastle Clock · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)