-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Offset clock
github-actions[bot] edited this page Jul 14, 2026
·
1 revision
Декоратор: время внутренних часов ± фиксированный сдвиг. «Завтра» и «вчера» без перевода системного времени.
Оборачивает любые часы пакета (или ваши PSR-20-совместимые с расширенным контрактом) и прибавляет смещение к каждому моменту:
use CloudCastle\Clock\OffsetClock;
use CloudCastle\Clock\SystemClock;
$tomorrow = OffsetClock::aheadBy(SystemClock::utc(), 86_400.0);
$yesterday = OffsetClock::behindBy(SystemClock::utc(), new DateInterval('P1D'));
$custom = new OffsetClock(SystemClock::utc(), -3.5); // на 3.5 секунды в прошлое
$tomorrow->now(); // текущий момент + суткиСмещение принимает секунды с дробной частью (точность — микросекунда,
округление до ближайшей) или DateInterval, включая инвертированные.
withTimezone() сохраняет связь с теми же внутренними часами: если внутри
управляемый MockClock, его дальнейшие сдвиги видны и новому декоратору.
- Проверка «поведения системы завтра» без изменения окружения.
- Комбинируется с любыми часами: смещённый Mock, смещённый Monotonic и т.д.
-
timestamp()/microtime()считаются арифметикой, без создания объектов дат.
- Смещение фиксированное: для «ускоренного времени» нужен ScaledClock.
- Тестировать письма/уведомления, которые должны уйти «за сутки до события».
- Стенды, живущие «в будущем» относительно продакшна.
- Эмулировать смещением таймзону — для этого есть
withTimezone().
flowchart LR
IN[Любые часы] --> OC["OffsetClock(±сдвиг)"]
OC -->|"now() = inner.now() ± offset"| OUT[Момент со сдвигом]
OC -.->|"withTimezone() — та же связь с inner"| OC2["OffsetClock (другая зона)"]
IN -.->|сдвиги видны| OC2
sequenceDiagram
participant U as Код
participant O as OffsetClock(+86400с)
participant I as SystemClock
U->>O: now()
O->>I: now()
I-->>O: текущий момент
O->>O: modify(+86 400 000 000 мкс)
O-->>U: «завтра в это время»
| Возможность | Clock | symfony/clock | lcobucci/clock | beste/clock | nesbot/carbon | ergebnis/clock | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Часы со смещением | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Clock |
| Смещение интервалом и секундами | ✅ | — | — | — | — | — | Clock |
| Микросекундная точность смещения | ✅ | — | — | — | — | — | Clock |
CloudCastle Clock · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)