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

Какую временную зону вернет Date.now?

2.0 Middle🔥 131 комментариев
#JavaScript Core

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

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

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

Краткий ответ

Date.now() возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC (Всемирное координированное время). Это всегда значение в UTC, не зависящее от локальных настроек временной зоны, летнего времени или географического положения пользователя.

Подробное объяснение

1. Основной принцип работы Date.now()

Date.now() — это статический метод объекта Date в JavaScript, который возвращает текущую временную метку (timestamp) как число. Это значение представляет собой количество миллисекунд, прошедших с "The Unix Epoch" — полуночи 1 января 1970 года по UTC.

Пример:

console.log(Date.now()); // Например: 1715000000000
// Это число, а не строковое представление даты.

2. Почему именно UTC, а не локальное время?

JavaScript использует UTC как единый эталон для внутреннего хранения дат по нескольким критически важным причинам:

  • Консистентность вычислений: Все операции с датами (сложение, сравнение, разность) выполняются корректно, независимо от временной зоны.
  • Стандартизация: Это соответствует стандарту ECMAScript (ECMA-262) и соглашению Unix-времени, используемому во многих языках программирования.
  • Устранение неоднозначностей: Локальное время зависит от множества факторов (геолокация, политика летнего времени), что делает его ненадежным для хранения и передачи.

3. Различие между Date.now(), new Date() и локальными представлениями

Чтобы понять изоляцию Date.now() от временных зон, сравним несколько методов:

const timestamp = Date.now(); // Только число в UTC
const dateFromTimestamp = new Date(timestamp); // Создаем объект Date из timestamp
const localString = dateFromTimestamp.toString(); // Локальное время в строке
const utcString = dateFromTimestamp.toUTCString(); // Строковое представление в UTC

console.log(timestamp);      // 1715000000000 (UTC, всегда)
console.log(localString);    // "Tue May 7 2024 15:30:00 GMT+0300 (Москва, стандартное время)"
console.log(utcString);      // "Tue, 07 May 2024 12:30:00 GMT" (UTC)

Ключевые наблюдения:

  • Date.now() — всегда возвращает число в UTC.
  • new Date() без аргументов создает объект, основанный на текущем системном времени, но внутренне хранит его как UTC-таймстамп.
  • Методы типа .toString(), .getHours(), .getDate() преобразуют внутренний UTC-таймстамп в локальную временную зону браузера/сервера.
  • Методы с префиксом UTC (например, .getUTCHours()) работают непосредственно с UTC-представлением.

4. Практическое применение и рекомендации

Когда использовать Date.now()?

  • Измерение интервалов и бенчмаркинг:
    const start = Date.now();
    // Выполняем операцию
    const duration = Date.now() - start; // Время в миллисекундах
    
  • Создание уникальных идентификаторов (в комбинации с другими значениями).
  • Передача временных меток между клиентом и сервером — всегда в UTC для избежания путаницы.

Чего НЕ делать с Date.now()?

  • Не пытайтесь извлечь из результата Date.now() часы, минуты или день — это просто число, а не структурированная дата.
  • Не путайте с локальным временем — для отображения пользователю преобразуйте UTC в локальную зону:
    function displayLocalTime(timestamp) {
      const date = new Date(timestamp);
      return date.toLocaleString('ru-RU', { 
        timeZone: 'Europe/Moscow',
        dateStyle: 'full', 
        timeStyle: 'long' 
      });
    }
    

5. Современная альтернатива: performance.now()

Для точного измерения производительности (например, анимаций, игровых циклов) используйте performance.now(). Он возвращает время с высокой точностью (доли миллисекунды) относительно начала загрузки страницы и не подвержен корректировкам системных часов.

const preciseStart = performance.now();
// Критичный по производительности код
const preciseDuration = performance.now() - preciseStart;

6. Особые случаи и подводные камни

  • Системные часы пользователя могут быть неправильно настроены — Date.now() отразит это некорректное время.
  • В очень старых браузерах (IE8 и ранее) Date.now() не существует. Используйте полифилл:
    if (!Date.now) {
      Date.now = function() { return new Date().getTime(); };
    }
    
  • Временные метки в секундах (как в Unix) — часто требуются в API. Для конвертации:
    const unixTimestampInSeconds = Math.floor(Date.now() / 1000);
    

Заключение

Date.now() — фундаментальный метод, возвращающий монотонно возрастающее число миллисекунд в UTC. Его главное преимущество — независимость от временных зон, что делает его идеальным для:

  • Хранения и передачи временных данных
  • Измерения интервалов
  • Логирования событий в распределенных системах

При разработке Frontend-приложений рекомендуется придерживаться принципа "хранить в UTC, отображать локально", и Date.now() является надежным инструментом для реализации этой стратегии. Для работы с отображением дат используйте Intl.DateTimeFormat или библиотеки типа date-fns, которые корректно обрабатывают локализацию на основе UTC-таймстампов.

Какую временную зону вернет Date.now? | PrepBro