
В JavaScript работа с датами основывается на объекте Date, который хранит время в миллисекундах с 1 января 1970 года по UTC. Для точного вычисления разницы между датами важно преобразовывать объекты Date в числовые значения с помощью методов getTime() или valueOf(). Это позволяет выполнять точные арифметические операции без ошибок, связанных с часовыми поясами.
Разница между датами может измеряться в миллисекундах, секундах, минутах, часах или днях. Для этого достаточно вычислить разность двух меток времени и при необходимости поделить на соответствующий коэффициент. Например, чтобы получить количество дней между датами, результат в миллисекундах делят на 1000 * 60 * 60 * 24.
Для сложных операций, включая сравнение дат, вычисление разницы с учётом часов, минут и секунд, удобны библиотеки вроде date-fns или Moment.js. Они предоставляют готовые функции для подсчёта дней, недель, месяцев и лет между датами, сокращая риск ошибок при ручных вычислениях.
При работе с датами важно учитывать особенности TimeZone и корректность ввода даты. Методы new Date() и Date.parse() могут возвращать разные значения при одинаковом текстовом представлении даты в зависимости от локали и часового пояса. Рекомендуется использовать ISO-формат YYYY-MM-DDTHH:mm:ssZ для универсальной интерпретации даты.
В статье представлены практические примеры вычисления разницы между датами в JavaScript, пошаговые методы перевода результата в нужные единицы времени и рекомендации по использованию стандартных методов и сторонних библиотек.
htmlСоздание объектов Date в JavaScript
Объект Date в JavaScript позволяет хранить и оперировать датами и временем. Создание нового объекта выполняется через new Date(), инициализация может быть разной в зависимости от задачи.
Для текущей даты и времени достаточно вызова let now = new Date();. Результат включает год, месяц, день, часы, минуты, секунды и миллисекунды.
Для конкретной даты можно передать строку в формате ISO 8601 или другой распознаваемый формат: let specific = new Date("2025-11-14T21:00:00");. Строка может содержать часовой пояс, чтобы корректно учесть локальное время.
Конструктор принимает числовые параметры: new Date(год, месяц, день, часы, минуты, секунды, миллисекунды). Месяцы считаются с нуля: январь – 0, декабрь – 11. Например, let date = new Date(2025, 10, 14, 21, 0, 0); создаёт объект для 14 ноября 2025 года в 21:00.
Также можно использовать число миллисекунд, прошедших с 1 января 1970 года: let timestamp = new Date(1700000000000);. Такой подход удобен для хранения и передачи дат в числовом формате.
Для проверки корректности даты используют isNaN(date.getTime()). Если результат true, объект содержит некорректную дату.
Вычисление разницы между датами в миллисекундах
В JavaScript объект Date хранит время в миллисекундах с 1 января 1970 года UTC. Для вычисления разницы между двумя датами необходимо получить числовое представление каждой даты с помощью метода getTime() или преобразования через оператор +.
Пример расчёта разницы:
const date1 = new Date(‘2025-11-14T10:00:00’);
const date2 = new Date(‘2025-11-15T12:30:00’);
const diffMs = date2.getTime() — date1.getTime();
console.log(diffMs); // 93600000
В этом примере разница составляет 93 600 000 миллисекунд, что соответствует 1 дню, 2 часам и 30 минутам. Отрицательное значение указывает, что первая дата позже второй.
При работе с миллисекундами удобно использовать константы для перевода в секунды, минуты, часы и дни:
const msInSecond = 1000;
const msInMinute = msInSecond * 60;
const msInHour = msInMinute * 60;
const msInDay = msInHour * 24;
После вычисления разницы в миллисекундах можно преобразовать её в более удобный формат:
const days = Math.floor(diffMs / msInDay);
const hours = Math.floor((diffMs % msInDay) / msInHour);
const minutes = Math.floor((diffMs % msInHour) / msInMinute);
const seconds = Math.floor((diffMs % msInMinute) / msInSecond);
Такой подход позволяет точно разделять разницу на дни, часы, минуты и секунды без потери точности. Для регулярных вычислений удобно оборачивать логику в функцию, принимающую две даты и возвращающую объект с компонентами времени.
Преобразование миллисекунд в дни, часы и минуты

Разница между датами в JavaScript часто возвращается в миллисекундах. Для удобного отображения её можно преобразовать в дни, часы и минуты. Основной подход заключается в последовательном делении и использовании остатка от деления.
Для расчёта используют следующие значения:
| Единица времени | Миллисекунды |
|---|---|
| 1 секунда | 1000 |
| 1 минута | 60 000 |
| 1 час | 3 600 000 |
| 1 день | 86 400 000 |
Пример функции для преобразования:
| Функция | Описание |
|---|---|
function convertMilliseconds(ms) {
const days = Math.floor(ms / 86400000);
ms %= 86400000;
const hours = Math.floor(ms / 3600000);
ms %= 3600000;
const minutes = Math.floor(ms / 60000);
return { days, hours, minutes };
}
|
Функция принимает миллисекунды и возвращает объект с днями, часами и минутами. |
Пример использования:
| Код | Результат |
|---|---|
const diff = new Date('2025-12-20') - new Date('2025-12-15');
const result = convertMilliseconds(diff);
console.log(result);
|
{ days: 5, hours: 0, minutes: 0 } |
Этот метод обеспечивает точное отображение времени без округлений и позволяет легко расширять расчёты до секунд или миллисекунд при необходимости.
Использование метода getTime() для сравнения дат
Метод getTime() возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC для конкретного объекта Date. Это позволяет напрямую сравнивать даты и вычислять разницу между ними.
Пример прямого сравнения двух дат:
const date1 = new Date('2025-11-14T12:00:00');
const date2 = new Date('2025-11-15T08:30:00');
if (date1.getTime() > date2.getTime()) {
console.log('date1 позже date2');
} else if (date1.getTime() < date2.getTime()) {
console.log('date1 раньше date2');
} else {
console.log('даты совпадают');
}
Для вычисления разницы между датами в миллисекундах используется простое вычитание:
const diffMs = date2.getTime() - date1.getTime();
console.log('Разница в миллисекундах:', diffMs);
Далее миллисекунды можно преобразовать в более удобные единицы:
- Секунды:
diffMs / 1000 - Минуты:
diffMs / (1000 * 60) - Часы:
diffMs / (1000 * 60 * 60) - Дни:
diffMs / (1000 * 60 * 60 * 24)
При сравнении большого количества дат рекомендуется сохранять значение getTime() в переменную, чтобы избежать повторного вычисления:
const time1 = date1.getTime();
const time2 = date2.getTime();
if (time1 > time2) {
console.log('date1 позже date2');
}
Метод getTime() гарантирует точность сравнения до миллисекунд и подходит для сортировки массивов дат:
const dates = [
new Date('2025-11-16'),
new Date('2025-11-14'),
new Date('2025-11-15')
];
dates.sort((a, b) => a.getTime() - b.getTime());
console.log(dates);
Разница между датами с помощью библиотеки Moment.js

Moment.js позволяет легко вычислять разницу между датами с точностью до дней, часов, минут и секунд. Для начала создайте объекты дат с помощью функции moment():
const date1 = moment('2025-11-01');
const date2 = moment('2025-11-14');
Чтобы получить разницу в днях, используйте метод diff с указанием единицы измерения:
const diffDays = date2.diff(date1, 'days'); // 13
Для вычисления разницы в часах, минутах или секундах достаточно заменить параметр ‘days’ на ‘hours’, ‘minutes’ или ‘seconds’.
Если нужно получить разницу в нескольких единицах сразу, можно использовать объект duration:
const duration = moment.duration(date2.diff(date1));
const days = duration.days();
const hours = duration.hours();
const minutes = duration.minutes();
Moment.js корректно учитывает переходы на летнее время и разные часовые пояса, что делает его удобным инструментом для расчета точной разницы между датами.
Расчёт рабочих дней между двумя датами
Для вычисления рабочих дней между двумя датами в JavaScript требуется учитывать только будние дни (понедельник–пятница). Сначала создаются объекты Date для начальной и конечной даты. Затем с помощью цикла перебираются все даты между ними.
Пример кода:
function getBusinessDays(startDate, endDate) {
let count = 0;
let current = new Date(startDate);
while (current <= endDate) {
let day = current.getDay();
if (day !== 0 && day !== 6) count++;
current.setDate(current.getDate() + 1);
}
return count;
}
В этом коде getDay() возвращает номер дня недели (0 – воскресенье, 6 – суббота). Условие day !== 0 && day !== 6 исключает выходные. Функция возвращает количество рабочих дней, включая начальную и конечную дату, если они попадают на будний день.
Если требуется исключить праздники, можно добавить массив с датами праздников и проверять каждую дату с помощью метода some(), уменьшая счётчик при совпадении. Это позволит получить точное число рабочих дней для реальных календарей.
Такой подход работает для периодов любой длины и легко адаптируется под локальные правила, включая сокращённые рабочие недели и нестандартные выходные.
Учёт временных зон при вычислении разницы
При вычислении разницы между датами важно учитывать временные зоны, так как методы Date в JavaScript по умолчанию работают в локальном времени пользователя. Игнорирование временной зоны может приводить к смещению разницы на часы или даже целые дни.
Для корректного расчёта разницы между датами учитывайте следующие подходы:
- Использование UTC: Методы
getTime(),getUTCFullYear(),getUTCMonth(),getUTCDate()позволяют получить дату и время в формате UTC, что исключает влияние локальной временной зоны. - Конвертация локальных дат в UTC: Если у вас есть даты в локальном времени, перед вычислением разницы их можно преобразовать в UTC с помощью
Date.UTC(year, month, day, hours, minutes, seconds). - Библиотеки для работы с датами: Moment.js или Luxon позволяют явно задавать временную зону и корректно вычислять разницу. Пример с Luxon:
import { DateTime } from 'luxon';
const dt1 = DateTime.fromISO('2025-11-14T12:00', { zone: 'Europe/Moscow' });
const dt2 = DateTime.fromISO('2025-11-15T12:00', { zone: 'America/New_York' });
const diff = dt2.diff(dt1, 'hours').hours;
console.log(diff); // Разница в часах с учётом временных зон
Если необходимо работать только с нативным JavaScript:
- Используйте
getTimezoneOffset()для корректировки локального времени к UTC. - Вычисляйте разницу в миллисекундах с учётом смещения:
const date1 = new Date('2025-11-14T12:00:00');
const date2 = new Date('2025-11-15T12:00:00');
const offset1 = date1.getTimezoneOffset() * 60000;
const offset2 = date2.getTimezoneOffset() * 60000;
const diffMs = (date2.getTime() - offset2) - (date1.getTime() - offset1);
const diffDays = diffMs / (1000 * 60 * 60 * 24);
console.log(diffDays);
Такой подход гарантирует, что разница между датами не будет смещена из-за разницы временных зон. Для проектов с международной аудиторией рекомендуется использовать UTC или специализированные библиотеки.
Обработка отрицательных и будущих дат
В JavaScript разница между датами может быть отрицательной, если первая дата позже второй. Для корректной обработки отрицательных значений можно использовать функцию Math.abs(), чтобы получить абсолютное значение разницы в миллисекундах:
const diffMs = Math.abs(date1.getTime() - date2.getTime());
Это гарантирует, что последующие вычисления, например преобразование в дни или часы, будут корректными независимо от порядка дат.
При работе с будущими датами важно учитывать текущее время. Например, чтобы определить, сколько дней осталось до события, можно вычесть текущую дату:
const today = new Date();
const futureEvent = new Date('2025-12-31');
const remainingMs = futureEvent.getTime() - today.getTime();
Если разница отрицательная, событие уже прошло, и её можно обработать отдельно или уведомить пользователя о прошедшей дате.
При форматировании результата полезно конвертировать миллисекунды в понятные единицы времени и добавлять знак «+» или «–» для визуальной индикации направления разницы:
const days = Math.floor(remainingMs / (1000 * 60 * 60 * 24));
const sign = remainingMs >= 0 ? '+' : '-';
Для точного расчёта будущих дат учитывайте переходы на летнее время и часовой пояс, используя методы Date UTC или библиотеки типа Luxon или Moment.js. Это исключает смещение при разнице дат, связанных с часовыми поясами.
Вопрос-ответ:
Как правильно вычислить разницу между двумя датами в JavaScript?
Для вычисления разницы между датами создайте два объекта Date и используйте метод getTime() для получения времени в миллисекундах. Затем вычтите одно значение из другого, чтобы получить разницу. Результат можно преобразовать в дни, часы или минуты, разделив на соответствующие коэффициенты (1000 для секунд, 60 000 для минут, 3 600 000 для часов, 86 400 000 для дней).
Можно ли учитывать рабочие дни при подсчёте разницы между датами?
Да. Для этого нужно пройтись циклом по каждому дню между датами и проверять, является ли день рабочим (обычно с понедельника по пятницу). Можно дополнительно исключать праздничные дни, если есть соответствующий список. Такой подход позволяет получить точное количество рабочих дней, а не просто календарные дни.
Как правильно работать с отрицательными разницами дат?
Отрицательная разница возникает, если первая дата позже второй. В JavaScript результат вычитания дат будет отрицательным числом миллисекунд. При необходимости можно использовать Math.abs(), чтобы получить положительное значение, или сохранять знак, если важно знать направление (прошло или осталось).
Какие сложности возникают при учёте временных зон?
Временные зоны влияют на точное время между датами, особенно при пересечении границ времени, например, при переходе на летнее/зимнее время. Чтобы корректно учитывать зоны, лучше использовать методы объекта Date с UTC (getUTCDate, getUTCHours и т.д.) или библиотеки вроде Moment.js с поддержкой зон. Это исключает ошибки из-за локальных смещений времени.
Можно ли использовать библиотеки для упрощения работы с датами?
Да, популярные библиотеки, такие как Moment.js, dayjs или date-fns, позволяют легко вычислять разницу между датами, учитывать временные зоны и преобразовывать миллисекунды в дни, часы и минуты. Они предоставляют удобные методы, например, diff или duration, что сокращает код и снижает вероятность ошибок при ручных вычислениях.
Как правильно вычислить разницу между двумя датами в JavaScript с учётом часов и минут?
В JavaScript для вычисления разницы между датами обычно используют метод getTime(), который возвращает количество миллисекунд, прошедших с 1 января 1970 года. Если есть две даты, например, date1 и date2, можно получить разницу в миллисекундах так: const diff = date2.getTime() - date1.getTime();. Чтобы перевести результат в часы и минуты, нужно разделить миллисекунды на соответствующие коэффициенты: 1 секунда = 1000 мс, 1 минута = 60 секунд, 1 час = 60 минут. Например: const hours = Math.floor(diff / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));. Такой способ учитывает часы и минуты точно и подходит как для прошлых, так и для будущих дат. Для проектов с более сложными временными операциями иногда используют библиотеки типа Moment.js или date-fns, которые упрощают расчёты и работу с часовыми поясами.
