Files
clickstream-data-platform/docs/architecture/generator/counter-time.md
T
ddadminandClaude Fable 5 6f18e9989c docs(generator): заморожена спека этапа 2, решения — в ADR 0015-0017
- Зачем:
  - спека разрослась до 1058 строк, а журнал решений в разделе 9 читался
    только целиком; агентам и людям нужен дешевый адресный заход к
    основаниям решений генератора.
- Что:
  - заведены ADR 0015 (пояс счетчика), 0016 (паспорт куки) и 0017 (номер
    заказа); четыре адресные ссылки на «раздел 9» перешиты на них.
  - раздел 9 пересобран в 11 тематических подразделов с датами и тикетами
    у каждого решения и закрыт пометкой о заморозке; устаревшие
    промежуточные замеры свернуты до указателей на актуальные.
  - строка статуса в шапке отмечает закрытие спеки как документа этапа 2.
- Проверка:
  - wc -l docs/specs/2026-08-01-generator.md (951, было 1058);
    rg -n 'раздел[а-яё]* 9|разделы 8 и 9' docs -g '*.md' — 18 попаданий,
    все классифицированы; разделы 1-8 нетронуты (сверка хешем).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 08:16:11 -04:00

2.7 KiB
Raw Blame History

Время модельного дня

Этот документ отвечает на вопрос, почему дата модельных суток не обязана совпадать с 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, описано в разделе «Часовые пояса» документа о хранилище. Типы и публичный смысл полей записаны в описании события. Выбор модели времени объясняет ADR 0015.