Avatar ·

Как получить метку времени (timestamp) в JavaScript?

Всем привет! Я новичок в JavaScript и пишу небольшой скрипт для веб-приложения. Мне нужно сохранять время, когда пользователь нажимает на кнопку, чтобы потом сравнивать эти моменты или отправлять на сервер. В других языках (например, в PHP я видел `time()`) это делается одной функцией. В JavaScript я нашел объект `Date`, но он возвращает какую-то странную строку типа "Fri Feb 02 2024 15:30:00 GMT+0300". Мне же нужно просто число — количество миллисекунд или секунд, как это обычно хранят в базах данных. Я пробовал так: ```javascript let now = new Date(); console.log(now); // Выводит строку, а не число ``` Потом я наткнулся на метод `getTime()`, но он возвращает очень большое число вроде 1706873400000. Это оно? Или есть более простой способ? Еще я слышал, что есть `Date.now()`, но не понимаю, в чем разница. Подскажите, пожалуйста, как правильно и современно получить timestamp в JavaScript? Что лучше использовать в 2024 году: `new Date().getTime()`, `Date.now()` или может быть что-то еще? И как перевести миллисекунды в секунды, если мне нужен Unix timestamp? Буду благодарен за объяснение с примерами. <<>>

Краткий ответ: используйте Date.now()

Самый простой и быстрый способ получить текущую метку времени в миллисекундах (с 1 января 1970 года UTC) — это статический метод Date.now(). Он доступен во всех современных браузерах и средах Node.js.

// Получаем текущий timestamp в миллисекундах
const timestampMs = Date.now();
console.log(timestampMs); // Например: 1706873400000

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

Метка времени (timestamp) в JavaScript по умолчанию измеряется в миллисекундах (1 секунда = 1000 миллисекунд). Это число представляет собой количество миллисекунд, прошедших с полуночи 1 января 1970 года по UTC (эпоха Unix).

Вот три основных способа получить timestamp:

  1. Date.now() — рекомендуемый способ
    const timestamp = Date.now();
    // Возвращает число (Number)

    Плюсы: коротко, быстро (не создает новый объект Date), легко читается.

  2. new Date().getTime() — классический способ
    const timestamp = new Date().getTime();
    // Работает так же, но создает лишний объект Date

    Этот метод полезен, если у вас уже есть объект Date, и вам нужно получить его timestamp:

    const myDate = new Date('2024-01-01');
    const timestamp = myDate.getTime(); // 1704067200000
  3. Оператор + перед Date (не рекомендуется для читаемости)
    const timestamp = +new Date(); // Работает, но выглядит неочевидно

Unix timestamp в секундах

Если вам нужен классический Unix timestamp (в секундах, как в PHP или базах данных), просто разделите миллисекунды на 1000 и округлите:

const unixTimestampSeconds = Math.floor(Date.now() / 1000);
console.log(unixTimestampSeconds); // Например: 1706873400

Используйте Math.floor(), а не Math.round(), чтобы timestamp всегда указывал на текущую или прошедшую секунду, а не на будущую.

Как это работает под капотом?

  • Date.now() — это статический метод, эквивалентный new Date().getTime(), но без создания объекта.
  • Значение зависит от системных часов пользователя. Его можно подделать, если пользователь изменит время на компьютере.
  • Точность: в большинстве браузеров — до миллисекунды. В старых IE — до 15 мс.

Пример: замер времени выполнения

const start = Date.now();

// Какой-то код
for (let i = 0; i < 1000000; i++) {
  Math.sqrt(i);
}

const end = Date.now();
console.log(`Операция заняла ${end - start} мс`);

Важное замечание

Не путайте timestamp с объектом Date. Timestamp — это просто число, с которым легко работать: сравнивать, складывать, вычитать. Для форматирования в человекочитаемую строку используйте методы объекта Date:

const now = new Date(Date.now());
console.log(now.toISOString()); // "2024-02-02T12:30:00.000Z"
console.log(now.toLocaleString('ru-RU')); // "02.02.2024, 15:30:00"
<<>>

Альтернативный подход: performance.now() для высокоточных замеров

Если вам нужна не календарная дата, а именно интервалы времени с высокой точностью (например, для бенчмарков или анимаций), используйте performance.now(). Этот метод доступен в браузерах и Node.js (через модуль perf_hooks).

// В браузере:
const start = performance.now();
// ... код ...
const end = performance.now();
console.log(`Время: ${end - start} миллисекунд`); // Точность до долей миллисекунды

Отличия от Date.now():

  • performance.now() возвращает время с точностью до микросекунд (в некоторых средах — до наносекунд).
  • Оно монотонно (не зависит от системных часов). Если пользователь переведет часы назад, Date.now() "откатится", а performance.now() продолжит расти.
  • Начало отсчета — не 1970 год, а момент загрузки страницы (или запуска процесса в Node.js). Поэтому его нельзя использовать как абсолютную метку времени для сохранения в БД.

Когда что использовать?

  • Date.now() — для сохранения времени события, создания расписаний, работы с датами.
  • performance.now() — для измерения производительности кода, игровых циклов, высокоточных таймеров.
  • new Date().getTime() — когда нужно получить timestamp из существующего объекта Date.
// Пример: замер с performance.now()
const t0 = performance.now();
heavyComputation();
const t1 = performance.now();
console.log(`Выполнение заняло ${(t1 - t0).toFixed(2)} мс`);