Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры0

Заказ попал во вчера: как согласовать даты в API и отчётах магазина

Один момент имеет разные календарные даты в Москве и UTC. На проверенном примере разбираем границы суток, дробные секунды и различие даты доставки и времени события.

Комментарии 0

Один жёлтый стеклянный шар на границе тёмной и светлой поверхностей: один момент между двумя датами
В этой статье

Заказ оформлен 27 сентября в 00:30 по Москве. В выгрузке дата начинается с 26 сентября, а менеджер ищет его в отчёте за 27-е. Заказ не обязательно потерян, и часы сервера не обязательно отстают. Один момент времени может относиться к разным календарным датам в разных часовых поясах.

До поиска ошибки стоит договориться о двух вещах: какое событие считает отчёт и в каком часовом поясе проходят границы его суток. Дата создания, дата оплаты и дата получения уведомления отвечают на разные вопросы. Даже идеально настроенные часы не сделают эти события одним и тем же.

Один момент, две записи

Возьмём учебное событие: 2026-09-27T00:30:00+03:00. Запись указывает местное время и смещение на три часа вперёд относительно UTC. Тот же момент в UTC записывается как 2026-09-26T21:30:00Z. Буква Z обозначает нулевое смещение. При правильном преобразовании событие осталось на месте, поменялось его представление.

Формат RFC 3339 позволяет передать дату, время и смещение однозначно в пределах предусмотренной им модели. Строка без смещения требует дополнительных условий контракта. Если одна сторона понимает её как московское время, а другая как UTC, возникает уже настоящая ошибка на три часа. Исправлять её прибавлением часов ко всем записям опасно: часть данных могла прийти корректно.

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

Как задать сутки без последней секунды

Для отчёта за 27 сентября 2026 года по Москве нижняя граница — начало 27 сентября, верхняя — начало 28 сентября. Нижнюю включаем, верхнюю исключаем. После преобразования в UTC это интервал от 2026-09-26T21:00:00Z включительно до 2026-09-27T21:00:00Z исключительно. Эти преобразования отдельно проверены в локальной модели Python с базой часовых поясов.

Такое правило удобнее, чем верхняя граница 23:59:59. Событие с долями секунды после 23:59:59 ещё относится к тем же суткам, но может не пройти сравнение с целой последней секундой. Условие «раньше начала следующего дня» охватывает доступную точность времени без угадывания количества девяток.

Соседний отчёт начинается ровно там, где закончился предыдущий. Событие на границе попадает в следующий интервал один раз. Если включить обе границы в обоих отчётах, полночь может учитываться дважды. Если исключить обе — пропасть из обоих. Здесь важен оператор сравнения, а не только красиво подписанный календарь.

Смещение и часовой пояс решают разные задачи

Смещение +03:00 достаточно, чтобы определить момент из приведённой записи. Но для правила «каждый день по местному времени» полезно хранить именованный часовой пояс, например Europe/Moscow. Он связан с правилами базы IANA, включая исторические изменения. Одно фиксированное смещение не описывает все возможные правила региона на любые даты.

В регионах с сезонным переводом часов календарные сутки могут отличаться по продолжительности от 24 часов. Поэтому для отчёта сначала определяют местные начала двух соседних дат, затем переводят обе границы в единую шкалу времени. Простое прибавление 24 часов к уже переведённой нижней границе подходит не для каждого региона и дня.

Среда должна располагать актуальными данными часовых поясов. Например, модуль Python использует системную базу или отдельный пакет данных; отсутствие базы и разные её версии — отдельные условия воспроизводимости. Это не инструкция менять часы рабочего сервера. Расчёт периода отчёта и синхронизация часов — разные проверки.

Дата доставки может вообще не быть моментом

Пожелание покупателя «доставить 27 сентября» может означать календарную дату по правилам магазина. Превращать её без договора в полночь UTC, а затем показывать как местное время — значит добавлять смысл, которого покупатель не задавал. Для такого поля нужен тип даты и явное правило её применения.

И наоборот, факт оплаты требует времени конкретного события, если от него зависит отчёт. Получение уведомления через десять минут не меняет момент оплаты в источнике. При позднем уведомлении система должна по договору либо пересчитать соответствующий период, либо отразить корректировку. Переносить событие в сегодняшний день только потому, что обработчик увидел его сегодня, можно лишь при таком определении показателя.

В приёмке полезно проверить событие непосредственно до полуночи, ровно в полночь и сразу после неё; отдельно — дробную секунду перед верхней границей. Затем повторить передачу того же события с другим корректным смещением. Отчёт должен сохранить результат, если обе записи обозначают один момент.

Для магазина на 1С-Битрикс и внешней учётной системы это вопрос общего контракта обмена, а не выбора одного волшебного формата. Сверьте тип события, исходное время, часовой пояс периода и правила запоздавших данных. После этого фраза «заказ попал во вчера» превращается в проверяемое утверждение: либо неверно выбраны сутки, либо неверно разобрано время, либо сравниваются разные события.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.