Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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)
Это избавит от множества багов, связанных с временем, и обеспечит корректность данных в многочасовой системе.