fix(scrapers/avito): unify _unix_to_date timezone across serp/houses/imv (#2129) #2142

Merged
lekss361 merged 1 commit from fix/avito-unix-date-tz into main 2026-07-02 14:03:12 +00:00
Owner

Закрывает #2129 (часть Epic #2126).

Баг

_unix_to_date был реализован 3 раза с РАЗНЫМИ таймзонами — один epoch давал разные даты:

  • avito.py (~214, inline) — MSK (#726)
  • avito_houses.py — UTC
  • avito_imv.py — naive/system-local

Подтверждено на fixture: removedDate=1756077885 → UTC 2025-08-24 vs MSK 2025-08-25.

Фикс

  • Новый avito_shared.py: единый _unix_to_date (MSK, epoch в секундах) + единый RUS_MONTHS, с обоснованием TZ в докстринге.
  • avito.py / avito_houses.py / avito_imv.py / avito_detail.py — заменены локальные копии импортом из avito_shared.
  • Новый тест test_avito_unix_date_tz_consistency.py (6 кейсов): один epoch → одна MSK-дата во всех путях, идентичность объектов функций, edge-cases None/0.

Выбор MSK обоснован

Avito — РФ-площадка, отображает даты в Europe/Moscow; уже задокументировано в #726 для avito.py.

⚠️ Нюанс данных (не баг, корректирующее поведение)

На будущих прогонах даты removed_date/publish_date (avito_imv_evaluations, house_placement_history), у которых время суток попадает в 21:00–23:59 UTC (~12.5% событий), сдвинутся на +1 день относительно старого UTC/naive-расчёта — это исправление к корректному МСК-представлению. startPriceDate/lastPriceDate (UTC-полночь) не затронуты. БД миграцией НЕ трогали.

Verify

  • grep "def _unix_to_date" → одно определение
  • pytest -k avito391 passed
  • ruff clean
Закрывает #2129 (часть Epic #2126). ## Баг `_unix_to_date` был реализован 3 раза с РАЗНЫМИ таймзонами — один epoch давал разные даты: - `avito.py` (~214, inline) — MSK (#726) - `avito_houses.py` — UTC - `avito_imv.py` — naive/system-local Подтверждено на fixture: `removedDate=1756077885` → UTC `2025-08-24` vs MSK `2025-08-25`. ## Фикс - Новый `avito_shared.py`: единый `_unix_to_date` (**MSK**, epoch в секундах) + единый `RUS_MONTHS`, с обоснованием TZ в докстринге. - `avito.py` / `avito_houses.py` / `avito_imv.py` / `avito_detail.py` — заменены локальные копии импортом из `avito_shared`. - Новый тест `test_avito_unix_date_tz_consistency.py` (6 кейсов): один epoch → одна MSK-дата во всех путях, идентичность объектов функций, edge-cases None/0. ## Выбор MSK обоснован Avito — РФ-площадка, отображает даты в Europe/Moscow; уже задокументировано в #726 для `avito.py`. ## ⚠️ Нюанс данных (не баг, корректирующее поведение) На будущих прогонах даты `removed_date`/`publish_date` (`avito_imv_evaluations`, `house_placement_history`), у которых время суток попадает в 21:00–23:59 UTC (~12.5% событий), сдвинутся на +1 день относительно старого UTC/naive-расчёта — это исправление к корректному МСК-представлению. `startPriceDate`/`lastPriceDate` (UTC-полночь) не затронуты. БД миграцией НЕ трогали. ## Verify - `grep "def _unix_to_date"` → одно определение - `pytest -k avito` → **391 passed** - ruff clean
lekss361 added 1 commit 2026-07-02 13:58:16 +00:00
fix(scrapers/avito): unify _unix_to_date timezone across serp/houses/imv (#2129)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
e0dcc220dd
Consolidate 3 divergent unix-epoch-to-date conversions (avito.py: MSK, documented
#726; avito_houses.py: UTC; avito_imv.py: naive/system-local) plus 3 duplicated
RUS_MONTHS dicts into a single app/services/scrapers/avito_shared.py module.

MSK is the correct canonical representation: Avito displays listing dates
(item-date, publishDate, price-history dates) in Europe/Moscow, and #726 already
established this to avoid off-by-one dates for listings bumped 00:00-03:00 MSK.
startPriceDate/lastPriceDate are always UTC-midnight in the source JSON so MSK
vs UTC never shifts them, but removedDate/publishDate carry real time-of-day and
DO shift for ~12.5% of events (21:00-23:59 UTC/local) once avito_imv.py/
avito_houses.py switch to MSK on the next scrape run.
lekss361 added the
scope/backend
scrapers
status/review
tradein
labels 2026-07-02 13:58:57 +00:00
lekss361 merged commit 32d1818fd4 into main 2026-07-02 14:03:12 +00:00
lekss361 deleted branch fix/avito-unix-date-tz 2026-07-02 14:03:12 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2142
No description provided.