Расчет количества дней между датами в JavaScript: подробный гайд

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для расчёта количества дней между двумя датами в JavaScript удобно воспользоваться объектом Date. Разницу сначала вычисляем в миллисекундах путём вычитания одной даты из другой. А затем итоговую разницу преобразуем в дни, поделив полученное значение на 86400000 — столько миллисекунд содержит один день. Вот пример такого кода:

JS
Скопировать код
// Создаём объекты Date для стартовой и конечной даты
// Пожалуйста, используйте вместо "YYYY-MM-DD" ваши реальные даты
const date1 = new Date("YYYY-MM-DD");
const date2 = new Date("YYYY-MM-DD");

// Вычисляем разность между датами в днях
const differenceInDays = Math.round((date2 – date1) / 86400000);
console.log(differenceInDays);  // В результате выводится количество дней

Разбор данных и работа с датами

Приведение дат в более удобный для операций формат — важный этап. Конструктор Date способен распознавать разные форматы дат, но предпочтительным является формат ISO 8601 (YYYY-MM-DD). Его универсальность и понятность реализуют лёгкую работу с датами.

JS
Скопировать код
// Примерное приведение дат
const parsedDate1 = new Date("2023-01-25");
const parsedDate2 = new Date("2023-02-01");

Если результат преобразования — NaN, функцию isNaN можно использовать для исключения ошибок. Воспринимайте ошибку как возможность для повторной попытки!

Проблема разницы во временных зонах

При работе с датами учитывайте, что временные зоны и переход на летнее время могут влиять на результаты. JavaScript по умолчанию применяет локальную зону времени браузера, что упрощает работу. Однако для предотвращения возможных разночтений, рекомендуется выполнять расчёты в UTC:

JS
Скопировать код
function parseAsUTC(dateString) {
  const date = new Date(dateString);
  return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
}

// Важна точность, поэтому работаем в формате UTC
const utcDate1 = parseAsUTC("2023-01-25");
const utcDate2 = parseAsUTC("2023-02-01");

Такой метод позволяет стандартизировать все даты, устраняя разночтения, вызванные разными временными зонами.

Помощь библиотек

В JavaScript для операций с датами полезными становятся библиотеки такие как Moment.js, date-fns и Luxon. Они облегчают учёт високосных годов и перехода на летнее время, а также предлагают более удобный синтаксис. Например, вычисление разности дней с использованием Moment.js выглядит так:

JS
Скопировать код
// Пример с применением Moment.js
const moment1 = moment("2023-01-25");
const moment2 = moment("2023-02-01");
const differenceInDays = moment2.diff(moment1, 'days');

Функции differenceInDays от date-fns и diff от Luxon работают по сходному принципу:

JS
Скопировать код
// Пример с date-fns
import { differenceInDays } from 'date-fns';
console.log(differenceInDays(new Date("2023-02-01"), new Date("2023-01-25")));

// Пример с Luxon
const { DateTime } = require("luxon");
const luxon1 = DateTime.fromISO("2023-01-25");
const luxon2 = DateTime.fromISO("2023-02-01");
const differenceInDays = luxon2.diff(luxon1, 'days').days;

Однако всегда помним, что эти библиотеки, к сожалению, не всегда снабжают вас кружкой кофе.

Подводные камни и рекомендации

  1. Форматирование: Используйте верные форматы дат, чтобы избежать ошибки Invalid Date.
  2. Версии библиотек: Будьте уверены, что вы работаете с последней стабильной версией библиотеки.
  3. Рефакторинг: Стремитесь к тому, чтобы ваша функция была универсальна и могла подсчитывать не только дни, но и часы, и минуты.
  4. Секунды интеркаляции: Не волнуйтесь из-за секунд интеркаляции — обычно JavaScript их игнорирует.

Визуализация

Можно представить визуализацию подсчёта количества дней между датами как планирование поездки по дороге из одного города в другой:

Markdown
Скопировать код
Город отправления (🏙️): 1 января 2023
Город назначения (🌆): 5 января 2023

🏙️🛣️🛑🏞️🛑🏔️🛑🌆 = 4 ночи в пути

Markdown
Скопировать код
Каждая остановка (🛑) – это одна ночь в пути, именно так мы и считаем кол-во дней!

Фокусируйтесь на подсчёте остановок, а не чашек кофе, чтобы понять промежуток времени в дороге.

Техники получения даты скриптом

Одной из ключевых особенностей работы с веб-приложениями является извлечение входных данных. Это можно сделать напрямую из объекта window, либо использовать стандартные API, например getElementById. Вот два примера:

Простой способ:

JS
Скопировать код
// Предполагая, что на странице есть поля ввода с id="startDate" и "endDate"
const startDate = window.startDate.value;
const endDate = window.endDate.value;

Надёжный способ для промышленного использования:

JS
Скопировать код
// Используем getElementById для получения значений
const startDate = document.getElementById('startDate').value;
const endDate = document.getElementById('endDate').value;

Полезные материалы