-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Truncating clock
github-actions[bot] edited this page Jul 14, 2026
·
1 revision
Декоратор, округляющий моменты вниз до границы единицы: секунда, минута, час,
сутки. Обобщение идеи MinuteClock из beste/clock на произвольные единицы.
use CloudCastle\Clock\TruncatingClock;
use CloudCastle\Clock\TruncationUnit;
use CloudCastle\Clock\SystemClock;
$bySecond = new TruncatingClock(SystemClock::utc()); // до секунды
$byMinute = TruncatingClock::toMinute(SystemClock::utc()); // паритет с beste
$byHour = new TruncatingClock(SystemClock::utc(), TruncationUnit::Hour);
$byDay = new TruncatingClock(SystemClock::utc(), TruncationUnit::Day);
$byMinute->now()->format('H:i:s.u'); // 12:34:00.000000Единицы задаёт enum TruncationUnit: Second, Minute, Hour, Day.
При withTimezone() момент сначала переводится в целевую зону и только
затем усекается — границы часов и суток зонозависимы, и «начало дня»
в Москве отличается от начала дня в UTC:
$frozen = FrozenClock::from('2026-05-20 23:30:00', 'UTC');
$clock = (new TruncatingClock($frozen, TruncationUnit::Day))->withTimezone('Europe/Moscow');
$clock->now()->format('Y-m-d H:i'); // 2026-05-21 00:00 — по Москве уже наступил новый день- Стабильные ключи кэша: все запросы одной минуты получают один момент.
- Группировка метрик по временным окнам без ручной арифметики.
- Зонозависимое усечение до суток — корректные «сегодня» для любой аудитории.
-
microtime()всегда с нулевой дробной частью — не для замеров длительностей.
- Ключи кэшей и rate-limit-бакетов:
truncated->timestamp(). - Отсечки «начало дня» в отчётах с учётом зоны пользователя.
- Усечение до суток в UTC для локальных бизнес-дат — «сегодня» уедет на день.
flowchart LR
IN[Внутренние часы] --> TC["TruncatingClock(unit)"]
TC -->|Second| S["12:34:56.000000"]
TC -->|Minute| M["12:34:00"]
TC -->|Hour| H["12:00:00"]
TC -->|Day| D["00:00:00"]
flowchart TD
A["now()"] --> B["inner.now()"]
B --> C{"есть withTimezone()?"}
C -->|да| D["перевести момент в целевую зону"]
C -->|нет| E["unit.truncate(момент)"]
D --> E
E --> F["момент на границе единицы"]
| Возможность | Clock | symfony/clock | lcobucci/clock | beste/clock | nesbot/carbon | ergebnis/clock | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Усечение до минуты | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | Clock + beste/clock |
| Секунда/час/сутки | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Clock |
| Зонозависимое усечение | ✅ | — | — | ❌ | — | — | Clock |
CloudCastle Clock · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)