Перейти к содержанию

Date.now()

Определение

Date.now() – статический метод JavaScript, возвращающий число миллисекунд с 1 января 1970 года 00:00:00 UTC (Unix epoch). Вызывается без new и без создания объекта Date, поэтому быстрее new Date().getTime().

4 мин 45 Обновлено 12 августа

Date.now() появился в ECMAScript 5 (2009) и с июля 2015 года поддерживается всеми современными браузерами (статус Baseline Widely available). Метод отвечает на один вопрос: сколько миллисекунд прошло от полуночи 1 января 1970 года по UTC (Unix epoch) до текущего момента. Такое число называют таймстемпом – универсальной меткой времени, которая не зависит от часового пояса и формата отображения. В прикладном коде таймстемпы встречаются повсюду: метки событий в логах и базах данных, ключи кэша, грубые замеры времени, контроль дрейфа таймеров setInterval.

Как это работает

Синтаксис предельно короткий: параметров нет, результат – число.

const ts = Date.now(); // например 1519211809934

// Unix-таймстемп в секундах
const unix = Math.floor(Date.now() / 1000);

Date.now() – статический метод класса Date: он вызывается только на самом классе. Записи вида myDate.now() или new Date.now() не сработают – метода now() у экземпляров просто нет. Объект Date при вызове не создаётся вовсе, и это главное практическое преимущество: в горячих участках кода (игровые циклы, частые обработчики) Date.now() отрабатывает быстрее, чем new Date().getTime(), и не оставляет мусора сборщику памяти.

Тот же таймстемп дают ещё три записи: new Date().getTime(), new Date().valueOf() и +new Date – унарный плюс приводит объект даты к числу. Значение у всех четырёх одинаковое, различается только цена вызова.

Date.now(), new Date().getTime() и performance.now() – в чём разница

Сравнение способов получить метку времени в JavaScript
СпособТочка отсчётаМонотонностьТочностьНазначение
Date.now()Unix epoch, UTCНет – читает системные часы1 мс (в Firefox – 2 мс)Таймстемпы событий, метки в логах и кэше
new Date().getTime()Unix epoch, UTCНет1 мсТо же, но с созданием лишнего объекта Date
+new DateUnix epoch, UTCНет1 мсКраткая запись getTime(); читается хуже
performance.now()timeOrigin – старт страницы или воркераДа – значение никогда не уменьшаетсяДробные мс (5–100 мкс после огрубления)Замеры длительности, профилирование

Ключевое отличие performance.now() – монотонные часы. Date.now() привязан к системному времени: если операционная система скорректировала часы по NTP или пользователь перевёл их вручную, разность двух вызовов может оказаться даже отрицательной. performance.now() от таких скачков не зависит: он возвращает дробные миллисекунды (тип DOMHighResTimeStamp) и отсчитывает их от Performance.timeOrigin – момента старта навигации в окне или запуска воркера. Абсолютное время без риска скачков даёт формула performance.timeOrigin + performance.now().

Про точность. Разрешение Date.now() – 1 миллисекунда: несколько вызовов подряд могут вернуть одно и то же значение. Браузеры дополнительно огрубляют таймеры для защиты от тайминг-атак и фингерпринтинга: в Firefox настройка privacy.reduceTimerPrecision включена по умолчанию, и результаты кратны 2 мс, а при включённом privacy.resistFingerprinting точность падает до 100 мс. У performance.now() механизм аналогичный: 5 микросекунд в cross-origin isolated контекстах и 100 микросекунд в обычных.

Зачем это нужно

Таймстемп – компактное число, которое однозначно сортируется, легко сравнивается и не требует парсинга. Отсюда типовые задачи:

  • Метки событий – зафиксировать момент действия пользователя для записи в лог или базу: число занимает меньше места, чем строка даты, и не зависит от локали.
  • Ключи кэша и версии данных – пометить ответ API или запись в localStorage временем создания, чтобы понимать, когда данные устарели. Метку последнего обновления виджета удобно класть в data-атрибут элемента.
  • Троттлинг обработчиков – ограничить частоту срабатывания тяжёлых обработчиков scroll или mousemove, в том числе при делегировании событий.
  • Контроль дрейфа таймеровsetInterval со временем «плывёт», и самокорректирующийся таймер сверяет фактическое время именно по Date.now().

Чего Date.now() не решает: длительности измеряют через performance.now() из-за монотонности, а для сложной работы с календарными датами нужен объект Date или новый стандарт Temporal API. Часовой пояс на Date.now() не влияет: таймстемп всегда считается по UTC. Пояс появляется только при форматировании – когда из числа делают объект new Date(ts) и выводят локальную дату.

Пример

Классический сценарий из документации MDN – грубый замер времени выполнения:

const start = Date.now();
doSomeLongRunningProcess();
console.log(`Прошло ${Date.now() - start} мс`);

Для коротких операций такой замер ненадёжен: шаг в 1–2 мс и зависимость от системных часов смазывают результат. Точный вариант – performance.now():

const t0 = performance.now();
doSomething();
const t1 = performance.now();
console.log(`Выполнение заняло ${t1 - t0} миллисекунд`);

А вот троттлинг обработчика скролла – задача, где Date.now() на своём месте: важна не точность, а дешевизна вызова.

let last = 0;
window.addEventListener("scroll", () => {
  const now = Date.now();
  if (now - last < 200) return; // не чаще 5 раз в секунду
  last = now;
  updateProgressBar();
});

Правило выбора простое: «который сейчас час» и метки событий – Date.now(); «сколько заняла операция» – performance.now().

Частые вопросы

Что возвращает Date.now() в JavaScript?

Число миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC (Unix epoch) до текущего момента. Метод не принимает параметров, результат имеет тип number. Метод статический: вызывается только как Date.now(), запись myDate.now() не сработает.

Чем Date.now() отличается от new Date()?

new Date() создаёт объект Date с методами форматирования и разбора дат, а Date.now() возвращает просто число – таймстемп. Объект при этом не создаётся, поэтому Date.now() быстрее и не нагружает сборщик мусора. Если нужна только метка времени, берите Date.now(); если нужно выводить дату – new Date().

Date.now() и new Date().getTime() – это одно и то же?

Семантически да: оба возвращают одинаковый таймстемп. То же значение дают new Date().valueOf() и +new Date (приведение даты к числу). Разница в цене: getTime() требует создать промежуточный объект Date, поэтому в коде, где важна производительность, предпочтителен Date.now().

Как получить Unix-таймстемп в секундах?

Разделить результат на 1000 и округлить вниз: Math.floor(Date.now() / 1000). Обратное преобразование – new Date(timestamp), где timestamp в миллисекундах; если исходник в секундах, его сначала умножают на 1000.

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

Для замеров длительности: у performance.now() монотонные часы (значение никогда не уменьшается и не зависит от перевода системного времени) и дробные миллисекунды. Отсчёт идёт от Performance.timeOrigin – старта страницы, а не от Unix epoch. Date.now() оставьте для абсолютных меток времени.

Насколько точен Date.now()?

Базовое разрешение – 1 миллисекунда, поэтому несколько вызовов подряд могут вернуть одно значение. В Firefox точность намеренно снижена до 2 мс (настройка privacy.reduceTimerPrecision включена по умолчанию), а при privacy.resistFingerprinting – до 100 мс: это защита от тайминг-атак и фингерпринтинга. Кроме того, значение зависит от системных часов и может сдвигаться при NTP-коррекции.

Зависит ли Date.now() от часового пояса?

Нет. Таймстемп всегда отсчитывается от 1 января 1970 года по UTC, в любом поясе одновременный вызов даст одно и то же число. Часовой пояс влияет только на форматирование, когда из таймстемпа делают объект new Date(ts) и выводят локальные дату и время.

Связанные термины

data-атрибут Data-атрибут – HTML-атрибут с префиксом data-*, валидный способ хранить произвольные данные в разметке любого элемента. В JavaScript доступен через element.dataset, в CSS – через селекторы [data-...] и функцию attr(). setInterval setInterval – метод Web API, многократно вызывающий функцию с заданной задержкой в миллисекундах. Возвращает числовой id таймера; повтор останавливают вызовом clearInterval(id). window.matchMedia() window.matchMedia() – метод JavaScript, который проверяет, соответствует ли документ CSS-медиазапросу. Возвращает MediaQueryList со свойством matches и событием change для слежения за брейкпоинтами и темой ОС. Делегирование событий Приём в JavaScript, когда один обработчик вешается на контейнер и ловит события от всех потомков через всплытие, определяя цель методом event.target.closest(). Плюрализация (склонение) в JS Плюрализация в JS – выбор правильной формы слова под число: 1 товар, 2 товара, 5 товаров. Классика рунета – самописная функция с n % 10, современный стандарт – встроенный API Intl.PluralRules с правилами CLDR.

Материалы по теме

Что почитать дальше по этой теме

Статья Что боты находят на сайте, а вы – нет Боты ходят по изнанке сайта, куда живой человек не забредёт, и фиксируют в логах то, чего не видно ни в Метрике, ни на витрине: падающие с ошибкой 500 страницы каталога, битый файл с 747 обращениями, поток сканеров секретов. Разбираю на реальных логах, что искать и как чинить. 7 мин 216 22 июля 2026 Инструкция Как выгрузить и читать access-логи, если хостинг хранит их три дня Access-лог – единственное место, где виден весь трафик сайта, включая ИИ-ботов, которых не замечают счётчики. Разбираю на практике: где взять логи, как не потерять их из-за ротации, какие команды показывают ботов, ошибки и подозрительную активность. 7 мин 170 21 июля 2026 Флагманский гайд AI-анализ email-обращений: методика на стыке Яндекс.Метрики и Claude Code Классический email-трекинг отвечает на вопрос «откуда пришло обращение». AI-слой отвечает на вопросы, которые раньше требовали ручного аналитика: значим ли email на фоне звонков, форм и мессенджеров, почему один источник даёт качественные обращения, а другой – пустые, какие сегменты визитов предшествуют письму, что написать в ответ с учётом пути пользователя. Здесь – как я собираю это на уже имеющемся стеке: Logs API Метрики, PostgreSQL и Claude Code, без новых платных сервисов. 11 мин 297 26 мая 2026 Флагманский гайд Майкор: ИИ-аудит проекта по 4 точкам контакта Майкор – это перекрёстный ИИ-аудит проекта в 4 точках контакта: сайт, контекстная реклама, AI-поиск и Яндекс.Карты. Я анализирую каждую систему и смотрю связки между ними – где маркетинг рассказывает одно, реклама ведёт на другое, а AI-системы цитируют третий номер телефона. В одном из моих аудитов медицинской клиники в Москве у организации в индексе AI-сервисов оказалось 6 разных номеров и всего 7 упоминаний на 64 проверочных запроса – при том, что в обычной выдаче Яндекса клиника была в топ-1. Майкор закрывает такие разрывы за один аудит вместо четырёх раздельных. 16 мин 501 13 мая 2026 Гайд FAQPage Schema: как разметить блок частых вопросов и попасть в AI-ответы FAQPage schema – один из самых эффективных типов разметки для попадания в AI-ответы. Страницы с FAQPage schema цитируются AI-поисковиками в 2,7 раза чаще. В этом гайде – формат разметки, правила написания ответов для AI, реализация на 1С-Битрикс и типичные ошибки, которые обнуляют эффект. 8 мин 331 25 апреля 2026