Расчет количества дней между датами в JavaScript: подробный гайд
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для расчёта количества дней между двумя датами в JavaScript удобно воспользоваться объектом Date
. Разницу сначала вычисляем в миллисекундах путём вычитания одной даты из другой. А затем итоговую разницу преобразуем в дни, поделив полученное значение на 86400000
— столько миллисекунд содержит один день. Вот пример такого кода:
// Создаём объекты 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
). Его универсальность и понятность реализуют лёгкую работу с датами.
// Примерное приведение дат
const parsedDate1 = new Date("2023-01-25");
const parsedDate2 = new Date("2023-02-01");
Если результат преобразования — NaN
, функцию isNaN
можно использовать для исключения ошибок. Воспринимайте ошибку как возможность для повторной попытки!
Проблема разницы во временных зонах
При работе с датами учитывайте, что временные зоны и переход на летнее время могут влиять на результаты. JavaScript по умолчанию применяет локальную зону времени браузера, что упрощает работу. Однако для предотвращения возможных разночтений, рекомендуется выполнять расчёты в UTC:
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 выглядит так:
// Пример с применением 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 работают по сходному принципу:
// Пример с 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;
Однако всегда помним, что эти библиотеки, к сожалению, не всегда снабжают вас кружкой кофе.
Подводные камни и рекомендации
- Форматирование: Используйте верные форматы дат, чтобы избежать ошибки
Invalid Date
. - Версии библиотек: Будьте уверены, что вы работаете с последней стабильной версией библиотеки.
- Рефакторинг: Стремитесь к тому, чтобы ваша функция была универсальна и могла подсчитывать не только дни, но и часы, и минуты.
- Секунды интеркаляции: Не волнуйтесь из-за секунд интеркаляции — обычно JavaScript их игнорирует.
Визуализация
Можно представить визуализацию подсчёта количества дней между датами как планирование поездки по дороге из одного города в другой:
Город отправления (🏙️): 1 января 2023
Город назначения (🌆): 5 января 2023
🏙️🛣️🛑🏞️🛑🏔️🛑🌆 = 4 ночи в пути
Каждая остановка (🛑) – это одна ночь в пути, именно так мы и считаем кол-во дней!
Фокусируйтесь на подсчёте остановок, а не чашек кофе, чтобы понять промежуток времени в дороге.
Техники получения даты скриптом
Одной из ключевых особенностей работы с веб-приложениями является извлечение входных данных. Это можно сделать напрямую из объекта window
, либо использовать стандартные API, например getElementById
. Вот два примера:
Простой способ:
// Предполагая, что на странице есть поля ввода с id="startDate" и "endDate"
const startDate = window.startDate.value;
const endDate = window.endDate.value;
Надёжный способ для промышленного использования:
// Используем getElementById для получения значений
const startDate = document.getElementById('startDate').value;
const endDate = document.getElementById('endDate').value;