- Зачем:
- спека отвечает «почему», а жанра «как пройти устройство по коду»
не было (#48); черновик в generator/README.md ждал выверки.
- Что:
- новый набор docs/architecture/generator/: индекс с целевой картиной
и mermaid-схемой плюс шесть поддокументов по темам тикета.
- демо-модуль и цель make demo: канонический D0, все стадии цепочки
на одном экране; тест-сторож проверяет стадии без прибитых чисел.
- раздел «Как это работает» в generator/README.md сжат до ссылки
на путеводитель, черновая врезка снята.
- Проверка:
- из generator/: make lint, make typecheck, make test (430 passed),
make demo; два слепых ревью и узкая перепроверка — находки закрыты.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.8 KiB
Время модельного дня
Этот документ отвечает на вопрос, почему дата модельных суток не обязана совпадать с UTC-датой события.
В коде встречаются три координаты времени:
- D — номер дня на оси модельного времени;
EventDate— дата D в поясе счетчика;UTCEventTime— абсолютная метка события.
Местное время гостя задает форму активности внутри суток, а границу дня задает пояс счетчика.
world.ORIGIN — D0
календарной оси: он переводит номер D в конкретную дату. Это не механизм
часового пояса. Механизм —
world.COUNTER_TIMEZONE_MINUTES,
смещение пояса счетчика от UTC.
В day._columns
EventDate получается как ORIGIN + D. Чтобы получить абсолютную полночь
тех же суток, код вычитает смещение счетчика, а затем прибавляет секунды
события внутри дня. Поэтому сутки 2026-06-01 в UTC+4 начинаются в
2026-05-31 20:00:00Z: у первых четырех часов
toDate(UTCEventTime) != EventDate.
day._starts сначала
выбирает час из городской строки весов, собранной
day._hour_cumulative,
а затем равномерно выбирает секунду внутри часа. Строка поворачивает суточную
волну на разницу между поясом гостя и поясом счетчика. Так вечерний пик гостя
попадает в нужные часы внутри дня, но граница суток и EventDate остаются
счетчиковыми.
Как часовой пояс меняет представление времени в ClickHouse, описано в разделе «Часовые пояса» документа о хранилище. Типы и публичный смысл полей записаны в описании события. Основание модели времени записано в спеке генератора, раздел 9.