Хранение временных значений в реляционных и нереляционных системах опирается на строго определённые форматы, обеспечивающие однозначность интерпретации. Основная сложность заключается не в самой дате, а в контексте её хранения: временная зона, точность, способ сериализации и поведение при миграциях между системами.
На уровне баз данных применяются несколько подходов:
Каждый подход имеет ограничения, которые проявляются при масштабировании системы, работе с часовыми поясами и интеграции с JavaScript-слоем приложения.
Unix timestamp представляет собой целое число, фиксирующее количество секунд или миллисекунд, прошедших с 1 января 1970 года (UTC).
В JavaScript и Day.js чаще используется миллисекундная точность:
const now = Date.now(); // 1716451200000
В Day.js преобразование выполняется напрямую:
import dayjs fr om 'dayjs';
const timestamp = dayjs().valueOf();
Преимущества хранения в виде timestamp:
Недостатки:
ISO 8601 представляет собой строковый стандарт:
2026-05-23T14:30:00.000Z
Day.js по умолчанию поддерживает преобразование в этот формат:
const iso = dayjs().toISOString();
ISO-строки часто используются в API и логировании, так как они:
При хранении в базе данных ISO-формат используется в основном в NoSQL-системах или как промежуточный слой между сервисами.
Основная проблема хранения дат заключается в несогласованности локального времени и UTC. Day.js решает это через плагины:
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
Пример конвертации:
const mskTime = dayjs().tz('Europe/Moscow').format();
В базе данных практически всегда сохраняется UTC-время, а локализация выполняется на уровне приложения.
Причины:
В большинстве архитектур используется следующая схема:
Пример хранения:
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
или:
created_at BIGINT NOT NULL
При получении данных из базы используется унифицированный парсинг:
const createdAt = dayjs(dbRow.created_at);
Day.js автоматически интерпретирует:
Дополнительная нормализация:
const normalized = dayjs(dbRow.created_at).utc();
Разные базы данных и драйверы могут по-разному трактовать точность:
TIMESTAMP — микросекундыDATETIME — секунды или миллисекунды (в
зависимости от версии)Date — миллисекундыDay.js работает на уровне миллисекунд, поэтому возможны потери точности при миграции.
Пример проблемы:
dayjs('2026-05-23T14:30:00.123456Z')
Микросекунды будут отброшены.
Day.js часто используется как слой между базой и бизнес-логикой:
function mapUser(row) {
return {
id: row.id,
createdAt: dayjs(row.created_at).utc(),
updatedAt: dayjs(row.updated_at).utc()
};
}
Форматирование для клиента:
function toResponse(entity) {
return {
...entity,
createdAt: entity.createdAt.format(),
updatedAt: entity.updatedAt.format()
};
}
При переносе данных между системами критично соблюдать:
Типичная ошибка миграции:
Day.js с UTC-плагином устраняет часть этих проблем:
const safe = dayjs(date).utc().valueOf();
С точки зрения СУБД:
Пример SQL-запроса:
SEL ECT *
FR OM events
WH ERE created_at BETWEEN 1716400000000 AND 1716500000000;
Day.js помогает формировать такие диапазоны:
const start = dayjs().startOf('day').valueOf();
const end = dayjs().endOf('day').valueOf();
Любые внешние данные требуют нормализации перед записью:
const normalizedDate = dayjs(inputDate).utc().toISOString();
или для timestamp:
const normalizedTs = dayjs(inputDate).valueOf();
Это устраняет:
На уровне архитектуры применяются следующие принципы:
Эта модель обеспечивает предсказуемость поведения при масштабировании, распределённых вычислениях и работе с историческими данными.