- Зачем:
- спека разрослась до 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>
41 lines
2.7 KiB
Markdown
41 lines
2.7 KiB
Markdown
# Время модельного дня
|
||
|
||
Этот документ отвечает на вопрос, почему дата модельных суток не обязана
|
||
совпадать с UTC-датой события.
|
||
|
||
В коде встречаются три координаты времени:
|
||
|
||
- D — номер дня на оси модельного времени;
|
||
- `EventDate` — дата D в поясе счетчика;
|
||
- `UTCEventTime` — абсолютная метка события.
|
||
|
||
Местное время гостя задает форму активности внутри суток, а границу дня задает
|
||
пояс счетчика.
|
||
|
||
[`world.ORIGIN`](../../../generator/src/clickstream_generator/world.py) — D0
|
||
календарной оси: он переводит номер D в конкретную дату. Это не механизм
|
||
часового пояса. Механизм —
|
||
[`world.COUNTER_TIMEZONE_MINUTES`](../../../generator/src/clickstream_generator/world.py),
|
||
смещение пояса счетчика от UTC.
|
||
|
||
В [`day._columns`](../../../generator/src/clickstream_generator/day.py)
|
||
`EventDate` получается как `ORIGIN + D`. Чтобы получить абсолютную полночь
|
||
тех же суток, код вычитает смещение счетчика, а затем прибавляет секунды
|
||
события внутри дня. Поэтому сутки `2026-06-01` в UTC+4 начинаются в
|
||
`2026-05-31 20:00:00Z`: у первых четырех часов
|
||
`toDate(UTCEventTime) != EventDate`.
|
||
|
||
[`day._starts`](../../../generator/src/clickstream_generator/day.py) сначала
|
||
выбирает час из городской строки весов, собранной
|
||
[`day._hour_cumulative`](../../../generator/src/clickstream_generator/day.py),
|
||
а затем равномерно выбирает секунду внутри часа. Строка поворачивает суточную
|
||
волну на разницу между поясом гостя и поясом счетчика. Так вечерний пик гостя
|
||
попадает в нужные часы внутри дня, но граница суток и `EventDate` остаются
|
||
счетчиковыми.
|
||
|
||
Как часовой пояс меняет представление времени в ClickHouse, описано в разделе
|
||
«Часовые пояса» [документа о хранилище](../storage.md). Типы и публичный смысл
|
||
полей записаны в [описании события](../../formats/clickstream-event.md).
|
||
Выбор модели времени объясняет
|
||
[ADR 0015](../../adr/0015-counter-timezone.md).
|