Данные и ожидания пользователей
Метка загрузки и момент актуальности курса: два значения в словаре полей
Практический порядок записи времени получения файла и времени обновления данных у источника в словаре полей, чтобы читатель не смешивал метку загрузки с моментом актуальности курса.

Два разных момента времени в обменном файле
В типичном обменном файле курса валют, будь то XML, CSV или TXT, встречаются два самостоятельных временных значения. Первое — момент, когда файл физически получен локально: скачан с сервера, распакован, загружен в рабочую таблицу. Второе — момент, когда источник сформировал или обновил данные курса, то есть когда значения внутри файла стали такими, какими они являются. Эти два момента могут совпасть, если файл формируется по запросу, но чаще между ними проходит интервал: от нескольких секунд до суток, если источник публикует сводный файл раз в день.
Смешение этих значений приводит к конкретному сбойному сценарию: сервис мониторинга видит метку загрузки, думает, что курс актуален «сейчас», и показывает пользователю устаревшую цену как текущую. Для обменного пункта это означает риск пересчёта по неверному курсу.
Запись обоих значений в словарь полей
Словарь полей — это документ или таблица, где для каждой колонки обменного файла указано имя, тип данных, единицы измерения и допустимый формат. Чтобы различать два момента времени, им нужны отдельные имена колонок. Условный пример записи: колонка received_at хранит метку загрузки, колонка source_updated_at хранит метку обновления данных у источника.
Для received_at допустимый формат — метка времени в UTC с точностью до секунды, например в виде ISO 8601: 2026-11-02T08:15:30Z. Для source_updated_at формат определяется спецификацией источника; если источник публикует дату обновления в заголовке файла или в отдельном элементе XML, словарь фиксирует, из какого именно поля эта метка извлекается. Если источник не публикует метку обновления явно, в словаре это следует указать прямо: значение колонки source_updated_at остаётся пустым или заполняется оценочным значением с пометкой о его условности.
Единицы измерения и допустимые форматы
Обе колонки измеряются в одних и тех же единицах — секундах от начала эпохи UTC, — но хранятся в форматах, удобных для чтения и для машинной обработки. Для человека удобно ISO 8601 с часовым поясом; для сравнения в коде удобно числовая метка в секундах. Словарь полей фиксирует оба представления, если они используются одновременно.
Важно зафиксировать, что метка загрузки всегда присваивается локально в момент получения файла, а метка обновления берётся из самого файла или из протокола обмена с источником. Если источник публикует файл по расписанию, например раз в час, и внутри файла стоит время последней генерации, это время и есть source_updated_at, даже если файл скачан на минуту позже.
Проверка при пересчёте курса
Практическая проверка проста. Перед пересчётом курса сервис вычитает из текущего времени значение source_updated_at и получает возраст данных. Если возраст превышает допустимый порог, например десять минут для биржевого курса или два часа для банковского, сервис помечает результат как устаревший и не использует его для автоматического обмена. Метка received_at в этом расчёте не участвует: она фиксирует только факт доставки файла.
При ручном просмотре читатель видит обе колонки рядом и сразу понимает, насколько данные отстают от момента получения файла. Если received_at и source_updated_at совпадают, источник обновляет данные по запросу; если между ними разрыв, это нормальное поведение периодической публикации.