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

Разделение момента и календарной даты

Момент обозначает одно событие на временной шкале. Календарная дата обозначает день в выбранном календаре и сама по себе не задаёт час. Срок может быть датой либо моментом — это зависит от договорённости участников процесса.

Учебный кабинет принимает заявку с датой документа 12 октября и фиксирует момент её поступления. Дата документа не должна превращаться в предыдущий день из-за преобразования часового пояса. Момент поступления, наоборот, должен позволять сравнить события двух систем независимо от способа отображения сотруднику.

Таблица 1 · Учебный артефакт
Поле в примереСмыслКак использовать
День документаКалендарная дата, указанная авторомНе сдвигать как момент при показе в другом регионе
Момент поступленияВремя регистрации события системойСопоставлять на общей временной шкале
Последний момент подтвержденияГраница допустимого действияПроверять с явно заданным правилом включения границы
Плановый день выдачиДень в календаре точки выдачиИспользовать календарь этой точки

Это словарь смысла полей, а не готовая схема определённого API. Согласованные названия и представление включают в паспорт операции.

Часовой пояс автора и системы

Уточните, чей пояс определяет день: автора, организации, точки выполнения или сервера. Пояс серверной машины может измениться при переносе приложения и поэтому не должен незаметно определять бизнес-правило.

В учебном примере сотрудник вводит срок для склада, который работает в другом поясе. Интерфейс показывает, что срок относится к складу. Для точного момента источник передаёт достаточную информацию, чтобы получатель не восстанавливал пояс по адресу пользователя. Если такой информации нет, значение следует признать недостаточным и запросить уточнение.

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

Границы суток в двух регионах

Для учебного расчёта зададим два условных пояса со смещениями +03 и +05. Одно событие, показанное в первом как 12 октября 23:30, во втором отображается 13 октября 01:30. Противоречия нет: отличаются локальные дни одного момента. Но отчёт «за 12 октября» обязан объяснять, какой из этих дней он использует.

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

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

Проверка пустой даты и смены пояса

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

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

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

Полезный результат — словарь полей, примеры для двух поясов, правило интервала и матрица пустых значений. Он позволяет обсуждать конкретную ошибку, а не общий симптом «даты иногда съезжают».

Обсудить временные поля обмена.