Перейти к содержимому

Даты и время в коде - хранение, пояса, периоды

Дата - самое обманчивое поле в проекте. Пока сайт живёт в одном часовом поясе, работает почти любой код; расхождения начинаются позже.

Что общего у этих задач

Дата в коде - объект, а не строка. Строка зависит от формата и языка, а объект сравнивается, складывается и уходит в запрос без сюрпризов.

Хранится всё во времени сервера, а показывается со сдвигом. Сдвиг зависит от настроек пользователя, и именно он даёт разницу между тем, что видит менеджер и что лежит в базе.

Границы периодов считают явно. «Вчера», «этот месяц» и «за смену» - это конкретные две отметки времени, а не понятие, которое код угадает сам.

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

С чего начать

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

Дальше приводят код к работе с объектами дат вместо строк. Строковые сравнения переживают ровно до первой смены формата или языка сайта.

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

Решения подтемы

Частые вопросы

В каком времени дата лежит в базе?

Во времени сервера, без пояса пользователя. Сдвиг добавляется при выводе, а не при хранении.

Почему у менеджеров разное время заказа?

У них разные часовые пояса в профиле. Показ сдвигается, сама запись при этом одна.

Можно ли фильтровать по дате строкой?

Можно, но формат строки должен совпасть в точности. Объект даты снимает этот вопрос.

Как посчитать «за вчера»?

Двумя явными отметками: начало и конец суток. Иначе результат зависит от времени запуска.

Связанные темы

Первоисточники