Avatar ·

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

Всем привет! Я только начал изучать JavaScript и столкнулся с такой задачей: мне нужно получить текущую метку времени (timestamp) для сохранения в базу данных и для сравнения дат. Я знаю, что в JavaScript есть объект Date, но не могу разобраться, как правильно извлечь timestamp. Пробовал писать такой код: ```javascript let now = new Date(); console.log(now); ``` Но он выводит что-то вроде "Fri Oct 25 2024 14:30:00 GMT+0300", а мне нужно число — количество миллисекунд или секунд с 1 января 1970 года. Видел, что кто-то использует `Date.now()`, кто-то `new Date().getTime()`, а кто-то пишет `+new Date()`. Ещё есть `Date.parse()` и `valueOf()`. Я совсем запутался! Подскажите, пожалуйста: 1. Какой самый правильный и современный способ получить timestamp? 2. В чём разница между миллисекундами и секундами? 3. Какой метод лучше использовать для производительности? 4. Нужно ли учитывать часовой пояс? Буду благодарен за подробное объяснение с примерами. Хочется понять не просто "как сделать", а "почему это работает именно так". <<>>

Что такое timestamp и зачем он нужен

Timestamp (метка времени) — это целое число, представляющее количество миллисекунд (или секунд), прошедших с 1 января 1970 года 00:00:00 UTC (так называемая Unix-эпоха). Это универсальный формат для хранения дат, не зависящий от часовых поясов и региональных настроек.

Основные способы получения timestamp в миллисекундах

1. Date.now() — самый современный и быстрый способ (ES5, 2009 год)

const timestamp = Date.now();
console.log(timestamp); // 1729852200000 (пример)

Это статический метод, не требует создания объекта Date. Работает во всех современных браузерах и Node.js. Рекомендуется для большинства задач.

2. new Date().getTime() — классический способ

const timestamp = new Date().getTime();
console.log(timestamp); // 1729852200000

Сначала создаётся объект Date, затем вызывается метод getTime(). Немного медленнее, чем Date.now(), но даёт тот же результат.

3. new Date().valueOf() — неявный вызов

const timestamp = new Date().valueOf();
console.log(timestamp); // 1729852200000

Метод valueOf() вызывается автоматически при числовом преобразовании объекта Date. Можно использовать, но менее читаемо.

4. Унарный плюс +new Date() — короткая запись

const timestamp = +new Date();
console.log(timestamp); // 1729852200000

Оператор "+" вызывает valueOf(), преобразуя объект в число. Компактно, но может сбивать с толку новичков.

Как получить timestamp в секундах

Некоторые API (например, PHP, Firebase) ожидают timestamp в секундах. Для этого разделите миллисекунды на 1000:

// В секундах (с дробной частью)
const seconds = Date.now() / 1000;
console.log(seconds); // 1729852200.123

// Целое число секунд (отбрасываем миллисекунды)
const secondsInt = Math.floor(Date.now() / 1000);
console.log(secondsInt); // 1729852200

Сравнение производительности

В среде Node.js и современных браузерах Date.now() работает быстрее всех остальных методов, так как не требует создания объекта. Вот примерный бенчмарк:

  • Date.now() — ~150 млн операций/сек
  • new Date().getTime() — ~80 млн операций/сек
  • +new Date() — ~70 млн операций/сек
  • new Date().valueOf() — ~60 млн операций/сек

Но для обычных задач разница незаметна. Выбирайте по читаемости кода.

Важные нюансы

  • Часовой пояс не влияет на timestamp — он всегда считается от UTC. Если вам нужно получить локальное время, используйте методы getHours(), getMinutes() и т.д. объекта Date.
  • Точность — JavaScript timestamp содержит миллисекунды. Для высокоточных измерений используйте performance.now() (до микросекунд), но он не подходит для хранения дат.
  • Безопасность — timestamp от клиента можно подделать. Для серверных приложений всегда используйте время на стороне сервера.

Полный пример использования

// Получаем timestamp
const now = Date.now();

// Создаём читаемую дату из timestamp
const date = new Date(now);
console.log(date.toISOString()); // "2024-10-25T11:30:00.000Z"

// Проверяем, прошло ли 5 минут
const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
if (someTimestamp > fiveMinutesAgo) {
  console.log('Событие произошло меньше 5 минут назад');
}

Итоговая рекомендация

Используйте Date.now() для получения timestamp в миллисекундах. Если нужно в секундах — делите на 1000 и округляйте. Это самый простой, быстрый и понятный способ.

<<>>

Альтернативный подход: работа с датами через библиотеки

Если вы работаете над крупным проектом или часто манипулируете датами, рекомендую рассмотреть специализированные библиотеки. Они решают множество проблем, связанных с часовыми поясами, форматированием и парсингом.

Пример с day.js (лёгкая библиотека, 2KB)

// Установка: npm install dayjs
import dayjs from 'dayjs';

// Получить timestamp
const timestamp = dayjs().valueOf(); // миллисекунды
const timestampSec = dayjs().unix(); // секунды

// Работа с датами
const date = dayjs('2024-10-25');
const diff = dayjs().diff(date, 'day'); // разница в днях
console.log(diff); // например, 0 (если сегодня 25 октября)

Пример с date-fns (модульная библиотека)

// Установка: npm install date-fns
import { getTime, format, differenceInDays } from 'date-fns';

const timestamp = getTime(new Date());
console.log(timestamp); // 1729852200000

const formatted = format(new Date(), 'yyyy-MM-dd HH:mm:ss');
console.log(formatted); // "2024-10-25 14:30:00"

const daysPassed = differenceInDays(new Date(), new Date(2024, 0, 1));
console.log(daysPassed); // количество дней с 1 января 2024

Когда использовать библиотеки

  • Когда нужно часто конвертировать даты между часовыми поясами
  • Для сложных расчётов (добавление месяцев, кварталов)
  • Для локализации (вывод дат на разных языках)
  • Если проект уже использует одну из этих библиотек

Но если вам нужен просто timestamp — нативный Date.now() справится отлично без лишних зависимостей.