Работа с UTC

UTC (Coordinated Universal Time) — универсальный мировой стандарт времени, не зависящий от часовых поясов и сезонного перевода часов. В Moment.js поддержка UTC встроена на уровне ядра библиотеки и используется для:

  • хранения времени в едином формате;
  • синхронизации данных между серверами;
  • работы с API;
  • обработки временных меток;
  • предотвращения ошибок часовых поясов.

Подключение Moment.js

<script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js"></script>

Для Node.js:

npm install moment
const moment = require('moment');

Создание даты в UTC

Метод moment.utc()

Главный способ работы с UTC — использование метода moment.utc().

const date = moment.utc();

console.log(date.format());

Результат:

2026-05-21T12:30:45Z

Символ Z означает UTC.


Создание UTC-даты из строки

const date = moment.utc('2026-05-21 15:00');

console.log(date.format());

Moment интерпретирует значение как UTC-время.


Создание UTC-даты из массива

const date = moment.utc([2026, 4, 21, 10, 30]);

console.log(date.format());

Результат:

2026-05-21T10:30:00Z

Месяцы в Moment.js индексируются с нуля:

Значение Месяц
0 Январь
1 Февраль
4 Май

Создание UTC-даты из Unix Timestamp

const date = moment.utc(1716288000000);

console.log(date.format());

Проверка режима UTC

Метод isUTC()

const localDate = moment();
const utcDate = moment.utc();

console.log(localDate.isUTC());
console.log(utcDate.isUTC());

Результат:

false
true

Перевод локального времени в UTC

Метод utc()

const local = moment();

console.log(local.format());

local.utc();

console.log(local.format());

После вызова utc() объект начинает работать в UTC.


Разница между moment.utc() и .utc()

moment.utc()

Создаёт новый объект сразу в UTC.

const date = moment.utc();

.utc()

Конвертирует существующий объект.

const date = moment().utc();

Возврат из UTC в локальное время

Метод local()

const utcDate = moment.utc();

console.log(utcDate.format());

utcDate.local();

console.log(utcDate.format());

Форматирование UTC-даты

Базовое форматирование

const date = moment.utc();

console.log(date.format('YYYY-MM-DD HH:mm:ss'));

ISO 8601

const date = moment.utc();

console.log(date.toISOString());

Пример:

2026-05-21T12:45:10.000Z

Вывод смещения

const date = moment.utc();

console.log(date.format('Z'));

Результат:

+00:00

Работа с часовыми смещениями

Метод utcOffset()

Позволяет установить произвольное смещение.

const date = moment().utcOffset(180);

console.log(date.format());

180 минут = +03:00.


Отрицательное смещение

const date = moment().utcOffset(-300);

console.log(date.format());

Результат соответствует -05:00.


Получение текущего смещения

const date = moment();

console.log(date.utcOffset());

Результат выводится в минутах.


Преобразование локального времени в UTC

Пример конвертации

const local = moment('2026-05-21 18:00');

console.log(local.format());

const utc = local.clone().utc();

console.log(utc.format());

Работа с серверным временем

UTC особенно важен при взаимодействии с backend-системами.

Получение времени от сервера

const serverTime = '2026-05-21T12:00:00Z';

const date = moment.utc(serverTime);

console.log(date.format());

Отображение серверного времени локально

const serverTime = moment.utc('2026-05-21T12:00:00Z');

console.log(serverTime.local().format());

Работа с Unix Timestamp

UTC и Unix Timestamp

Unix Timestamp всегда хранится в UTC.

const timestamp = moment.utc().unix();

console.log(timestamp);

Создание даты из timestamp

const date = moment.unix(1716288000).utc();

console.log(date.format());

Сравнение UTC-даты и локальной даты

Пример сравнения

const utcDate = moment.utc('2026-05-21 12:00');
const localDate = moment('2026-05-21 15:00');

console.log(utcDate.isSame(localDate));

Moment автоматически приводит значения к единому формату.


Вычисления с UTC

Добавление времени

const date = moment.utc();

date.add(3, 'days');

console.log(date.format());

Вычитание времени

const date = moment.utc();

date.subtract(5, 'hours');

console.log(date.format());

Разница между датами

const start = moment.utc('2026-05-01');
const end = moment.utc('2026-05-21');

console.log(end.diff(start, 'days'));

Начало и конец периода в UTC

Начало дня

const date = moment.utc().startOf('day');

console.log(date.format());

Конец дня

const date = moment.utc().endOf('day');

console.log(date.format());

Начало месяца

const date = moment.utc().startOf('month');

console.log(date.format());

Парсинг UTC-строк

Строка ISO

const date = moment.utc('2026-05-21T14:30:00Z');

console.log(date.format());

Пользовательский формат

const date = moment.utc(
    '21-05-2026 14:30',
    'DD-MM-YYYY HH:mm'
);

console.log(date.format());

Проверка корректности UTC-даты

Метод isValid()

const date = moment.utc('invalid');

console.log(date.isValid());

Клонирование UTC-объектов

Метод clone()

const original = moment.utc();

const copy = original.clone();

copy.add(1, 'day');

console.log(original.format());
console.log(copy.format());

UTC и JSON

Сериализация даты

const data = {
    createdAt: moment.utc()
};

console.log(JSON.stringify(data));

Moment автоматически преобразуется в ISO-формат UTC.


UTC в базах данных

Наиболее распространённый подход:

  1. хранение времени в UTC;
  2. преобразование в локальное время только при отображении;
  3. передача дат между сервисами в ISO 8601.

Пример:

const createdAt = moment.utc().toISOString();

Ошибки при работе с UTC

Потеря часового пояса

Неправильно:

moment('2026-05-21');

Правильно:

moment.utc('2026-05-21');

Смешивание локального времени и UTC

const local = moment();
const utc = moment.utc();

console.log(local.diff(utc));

Перед сравнением желательно привести даты к одному режиму.


Изменение исходного объекта

Moment.js изменяет объект напрямую.

const date = moment.utc();

date.add(1, 'day');

Для безопасной работы:

const newDate = date.clone().add(1, 'day');

Практический пример: журнал событий

Сохранение события

const event = {
    id: 1,
    createdAt: moment.utc().toISOString()
};

console.log(event);

Отображение пользователю

const createdAt = moment.utc(event.createdAt);

console.log(
    createdAt.local().format('DD.MM.YYYY HH:mm:ss')
);

Практический пример: таймер до события

const eventDate = moment.utc('2026-06-01 12:00');

const now = moment.utc();

const hours = eventDate.diff(now, 'hours');

console.log(hours);

Работа с API

Отправка UTC на сервер

fetch('/api/event', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        createdAt: moment.utc().toISOString()
    })
});

Получение UTC с сервера

fetch('/api/event')
    .then(response => response.json())
    .then(data => {
        const date = moment.utc(data.createdAt);

        console.log(date.local().format());
    });

UTC и Moment Timezone

Для полноценной работы с часовыми поясами используется дополнение moment-timezone.

Подключение

<script src="https://cdn.jsdelivr.net/npm/moment-timezone/builds/moment-timezone-with-data.min.js"></script>

Преобразование UTC в конкретный часовой пояс

const date = moment.utc('2026-05-21T12:00:00Z');

console.log(
    date.tz('Asia/Almaty').format()
);

Получение времени в разных зонах

const utc = moment.utc();

console.log(utc.tz('Europe/London').format());
console.log(utc.tz('Asia/Tokyo').format());
console.log(utc.tz('America/New_York').format());

Лучшие практики

Хранение времени в UTC

Наиболее безопасная архитектура:

  • сервер хранит UTC;
  • база данных хранит UTC;
  • API передаёт UTC;
  • локализация выполняется только в интерфейсе.

Использование ISO 8601

Предпочтительный формат:

2026-05-21T12:00:00Z

Явное указание UTC

Нежелательно полагаться на автоматическое определение часового пояса.

Плохо:

moment(dateString);

Хорошо:

moment.utc(dateString);

Использование clone()

Moment.js изменяемый.

Безопасный подход:

const next = current.clone().add(1, 'day');

Ограничения Moment.js

Moment.js считается legacy-библиотекой. Разработка переведена в режим поддержки.

Современные альтернативы:

  • Luxon;
  • Day.js;
  • date-fns;
  • Temporal API.

Тем не менее Moment.js остаётся широко используемым во многих проектах и корпоративных системах, особенно при работе со старыми кодовыми базами.