← Назад к вопросам

Как работает UTC?

1.0 Junior🔥 171 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

UTC: Всемирное координированное время

UTC (Coordinated Universal Time) — это международный стандарт времени, используемый для синхронизации часов по всему миру. UTC — это эталон, от которого отсчитываются все временные зоны на Земле.

История и определение

UTC пришел на смену старому стандарту GMT (Greenwich Mean Time). Различие между ними минимально (обычно менее секунды), но UTC точнее благодаря использованию атомных часов.

UTC основан на:

  • TAI (International Atomic Time) — атомных часах
  • Земного вращения — дни (сутки) остаются около 24 часов

Для синхронизации в UTC периодически добавляют leap seconds (високосные секунды) для компенсации замедления вращения Земли.

Как UTC организован

UTC — это стандартная 24-часовая система, не привязанная к местному времени. Обозначается как:

UTC+0 или UTC±00:00

Все остальные временные зоны рассчитываются относительно UTC:

Примеры часовых поясов:
UTC+0   — Лондон (зимой)
UTC+1   — Центральная Европа (зимой)
UTC+2   — Восточная Европа (зимой)
UTC+3   — Московское время (весь год)
UTC-5   — Восточное американское время (зимой)
UTC+8   — Пекин
UTC+9   — Токио

UTC в программировании

В информатике UTC — это стандартный формат для хранения и передачи времени. Все серверы, базы данных и API обычно работают с UTC для обеспечения согласованности данных.

JavaScript и UTC

// Получить текущее UTC время
const now = new Date(); // Создаёт дату в UTC
console.log(now.toISOString()); // Вывод: 2026-04-02T14:30:45.123Z

// ISO 8601 формат (международный стандарт)
// Z в конце означает UTC (Zulu Time в военной системе)

// Получить миллисекунды с 1970-01-01 UTC
const timestamp = Date.now(); // 1743916245123

// Создать дату из UTC времени
const utcDate = new Date("2026-04-02T14:30:45Z");
console.log(utcDate.getTime()); // Миллисекунды

// Преобразование
const date = new Date();
const utcString = date.toISOString(); // UTC в ISO 8601
const timestamp = date.getTime();     // UTC в миллисекундах

ВАЖНО: В JavaScript new Date() создаёт дату в UTC, но методы getHours(), getMinutes() возвращают локальное время браузера, а методы getUTCHours(), getUTCMinutes() возвращают UTC:

const date = new Date("2026-04-02T14:30:00Z");

// Если браузер в Москве (UTC+3)
console.log(date.getHours());    // 17 (локальное: 14 + 3 часа)
console.log(date.getUTCHours()); // 14 (UTC)

UTC vs локальное время

Проблема: Пользователи в разных странах видят разное время. Как синхронизировать?

Решение: Использовать UTC на сервере, преобразовывать в локальное время на клиенте:

// На сервере (Node.js / Python / Go)
// Всегда работай с UTC
const eventTime = new Date(); // 2026-04-02T14:30:00Z (UTC)
db.events.insert({ time: eventTime.toISOString() }); // Сохраняем в UTC

// На клиенте (браузер)
// Преобразуем UTC в локальное время пользователя
const event = await fetch('/api/events/123'); // { time: "2026-04-02T14:30:00Z" }
const utcDate = new Date(event.time);

// Форматируем в локальном времени
const localTime = new Intl.DateTimeFormat('ru-RU', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit',
  timeZone: 'Europe/Moscow' // Москва (UTC+3)
}).format(utcDate);

console.log(localTime); // "2 апреля 2026 г., 17:30"

Часовые пояса (Timezones)

Время в разных регионах отличается. Для работы с часовыми поясами используют библиотеки:

Moment.js (устаревает, но ещё используется)

const moment = require('moment-timezone');

// Создать дату в UTC
const utcTime = moment.utc('2026-04-02 14:30:00');

// Преобразовать в разные часовые пояса
console.log(utcTime.tz('Europe/Moscow').format()); // 2026-04-02 17:30:00 +03:00
console.log(utcTime.tz('America/New_York').format()); // 2026-04-02 10:30:00 -04:00
console.log(utcTime.tz('Asia/Tokyo').format()); // 2026-04-02 23:30:00 +09:00

date-fns-tz (современный подход)

import { formatInTimeZone } from 'date-fns-tz';

const utcDate = new Date('2026-04-02T14:30:00Z');

const moscow = formatInTimeZone(utcDate, 'Europe/Moscow', 'HH:mm:ss');
const tokyo = formatInTimeZone(utcDate, 'Asia/Tokyo', 'HH:mm:ss');
const newyork = formatInTimeZone(utcDate, 'America/New_York', 'HH:mm:ss');

console.log(moscow);  // 17:30:00
console.log(tokyo);   // 23:30:00
console.log(newyork); // 10:30:00

Практические советы для фронтенд-разработчика

1. Всегда передавай время в UTC

// Отправляем на сервер в UTC
const payload = {
  eventTime: new Date().toISOString(), // "2026-04-02T14:30:45.123Z"
};
await fetch('/api/events', { method: 'POST', body: JSON.stringify(payload) });

2. Сохраняй часовой пояс пользователя, если нужно

// В профиле пользователя
const userProfile = {
  userId: 123,
  timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone, // "Europe/Moscow"
};

3. При отображении — переводи UTC в локальное время

function formatDateTime(isoString: string, timeZone: string): string {
  const date = new Date(isoString);
  return new Intl.DateTimeFormat('ru-RU', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZone,
  }).format(date);
}

console.log(formatDateTime('2026-04-02T14:30:00Z', 'Europe/Moscow')); // 02.04.2026, 17:30:00

4. Избегай преобразований в локальное время на сервере

// Плохо
const localTime = date.toLocaleString(); // Зависит от часового пояса сервера!
db.save(localTime);

// Хорошо
const utcTime = date.toISOString();
db.save(utcTime);

Частые ошибки

Ошибка 1: Сравнение времён в разных часовых поясах

// Плохо
const isExpired = userDate > new Date(); // Может быть ошибка

// Хорошо
const utcNow = new Date();
const isExpired = new Date(userDate) > utcNow; // Оба в UTC

Ошибка 2: Использование getHours() для UTC

const date = new Date("2026-04-02T14:30:00Z");

// Плохо — вернёт локальное время
console.log(date.getHours()); // Может быть 17 или 14 в зависимости от браузера

// Хорошо
console.log(date.getUTCHours()); // Всегда 14

Заключение

UTC — это единый стандарт времени для всего мира:

  • На сервере — всегда работай с UTC (ISO 8601 формат)
  • На клиенте — преобразуй UTC в локальное время пользователя
  • В базе данных — сохраняй time с часовым поясом (TIMESTAMPTZ)
  • В API — передавай даты в ISO 8601 с Z (UTC)

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