Работа с датами и временем в JavaScript (Node.js): от основ до продвинутых техник
Работа с датами и временем — одна из самых частых задач в веб-разработке. Будь то логирование событий, обработка пользовательских данных, планирование задач или отображение временных меток — без умения управлять датами в JavaScript не обойтись. В этой статье мы разберем все ключевые аспекты работы с датами в среде Node.js: от создания и форматирования до сложных манипуляций с часовыми поясами и использования популярных библиотек.
Основы: объект Date в JavaScript
Встроенный объект Date — фундамент для работы с датами. Он хранит количество миллисекунд, прошедших с 1 января 1970 года (Unix-эпоха).
Создание даты
Существует несколько способов создания экземпляра Date:
// Текущая дата и время
const now = new Date();
console.log(now); // 2025-03-15T10:30:00.000Z
// Из миллисекунд (Unix timestamp)
const fromTimestamp = new Date(1742025000000);
console.log(fromTimestamp); // 2025-03-15T10:30:00.000Z
// Из строки (ISO 8601)
const fromString = new Date('2025-03-15T10:30:00');
console.log(fromString);
// Из компонентов (год, месяц, день, час, минута, секунда, миллисекунда)
const fromComponents = new Date(2025, 2, 15, 10, 30, 0, 0); // Месяцы: 0-11
console.log(fromComponents); // March 15, 2025 10:30:00
Важно: месяцы в JavaScript нумеруются с 0 (январь — 0, декабрь — 11).
Получение компонентов даты
Методы для извлечения отдельных частей даты:
const date = new Date('2025-03-15T10:30:45.123Z');
console.log(date.getFullYear()); // 2025
console.log(date.getMonth()); // 2 (март)
console.log(date.getDate()); // 15
console.log(date.getDay()); // 6 (суббота, 0 - воскресенье)
console.log(date.getHours()); // 10
console.log(date.getMinutes()); // 30
console.log(date.getSeconds()); // 45
console.log(date.getMilliseconds());// 123
console.log(date.getTime()); // миллисекунды с эпохи
Форматирование дат в Node.js
Стандартный Date предоставляет ограниченные возможности форматирования. Для вывода в читаемом виде используйте toLocaleDateString() и toLocaleString().
const date = new Date('2025-03-15T10:30:00');
// Локализованное форматирование
console.log(date.toLocaleDateString('ru-RU')); // 15.03.2025
console.log(date.toLocaleTimeString('ru-RU')); // 10:30:00
console.log(date.toLocaleString('ru-RU')); // 15.03.2025, 10:30:00
// С опциями
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: '2-digit',
minute: '2-digit'
};
console.log(date.toLocaleString('ru-RU', options));
// суббота, 15 марта 2025 г., 10:30
Кастомное форматирование
Для полного контроля напишите простую функцию:
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
const map = {
YYYY: date.getFullYear(),
MM: String(date.getMonth() + 1).padStart(2, '0'),
DD: String(date.getDate()).padStart(2, '0'),
HH: String(date.getHours()).padStart(2, '0'),
mm: String(date.getMinutes()).padStart(2, '0'),
ss: String(date.getSeconds()).padStart(2, '0'),
};
return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => map[match]);
}
console.log(formatDate(new Date(), 'DD.MM.YYYY')); // 15.03.2025
console.log(formatDate(new Date(), 'HH:mm:ss')); // 10:30:00
Манипуляции с датами: добавление, вычитание, сравнение
Изменять даты можно напрямую через методы set* или работая с миллисекундами.
Добавление и вычитание времени
const date = new Date('2025-03-15T10:30:00');
// Добавить 5 дней
date.setDate(date.getDate() + 5);
console.log(date); // 2025-03-20T10:30:00
// Добавить 2 часа
date.setHours(date.getHours() + 2);
console.log(date); // 2025-03-20T12:30:00
// Вычесть 30 минут
date.setMinutes(date.getMinutes() - 30);
console.log(date); // 2025-03-20T12:00:00
// Через миллисекунды (добавить 1 неделю)
const oneWeek = 7 * 24 * 60 * 60 * 1000;
const newDate = new Date(date.getTime() + oneWeek);
console.log(newDate); // 2025-03-27T12:00:00
Сравнение дат
Даты можно сравнивать как числа (через getTime()) или напрямую операторами:
const date1 = new Date('2025-03-15');
const date2 = new Date('2025-03-20');
console.log(date1 < date2); // true
console.log(date1 > date2); // false
console.log(date1.getTime() === date2.getTime()); // false
// Разница в днях
const diffMs = date2 - date1;
const diffDays = diffMs / (1000 * 60 * 60 * 24);
console.log(diffDays); // 5
// Проверка на одинаковую дату (без времени)
function isSameDay(d1, d2) {
return d1.getFullYear() === d2.getFullYear() &&
d1.getMonth() === d2.getMonth() &&
d1.getDate() === d2.getDate();
}
console.log(isSameDay(date1, date2)); // false
Работа с часовыми поясами в Node.js
По умолчанию Date работает в локальном часовом поясе сервера. Для работы с UTC используйте методы getUTC* и setUTC*.
const date = new Date('2025-03-15T10:30:00+03:00'); // Московское время
console.log(date.getHours()); // 10 (локальное время сервера