Сравнение дат без учёта времени в JavaScript: решение
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если вы хотите сравнить только даты, не принимая во внимание время, вы можете установить время на начало суток для каждой из сравниваемых дат и сравнить их числовые представления (timestamp):
const date1 = new Date('2023-03-25');
const date2 = new Date('2023-03-25');
const isSameDay = (d1, d2) => d1.setHours(0, 0, 0, 0) === d2.setHours(0, 0, 0, 0);
console.log(isSameDay(date1, date2)); // true, вероятно, это один и тот же день
Метод setHours(0, 0, 0, 0)
, устанавливающий время на полночь, помогает исключить разницу во времени при сравнении дат.
Особенности работы с часовыми поясами
Когда дело доходит до работы с часовыми поясами, важно производить сравнение дат, предварительно приведя их к универсального времени (UTC):
const isSameDayUTC = (d1, d2) => {
let date1UTC = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate());
let date2UTC = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate());
return date1UTC === date2UTC; // Сравнение дат в UTC
};
Это подход устраняет различия между часовыми поясами и обеспечивает точное сравнение дат.
Сравнение дат через их сериализацию
Вы также можете сериализовать даты в строковый формат и сравнивать полученные строки:
const serializeDate = (date) => date.toISOString().split('T')[0];
console.log(serializeDate(date1) === serializeDate(date2)); // true, даты совпадают
Сериализация даты в строковое представление обеспечивает возможность сравнивать даты, исключив из учёта время и временные зоны.
Дополнительные возможности при работе с объектами Date
Если в вашем процессе разработки встречается необходимость в сравнении дат, может быть полезно добавить метод в прототип Date
:
Date.prototype.withoutTime = function() {
let d = new Date(this);
d.setHours(0, 0, 0, 0);
return d; // Вернуть объект даты без информации о времени
};
console.log(date1.withoutTime().getTime() === date2.withoutTime().getTime()); // true, даты совпадают
Данный метод упрощает процесс сравнения, добавляя к объекту Date
новый функционал.
Использование сторонних библиотек
Внешние библиотеки, такие как Moment.js, могут оказаться полезными при выполнении сложных операций над временем:
const moment = require('moment');
const areDatesTheSame = (d1, d2) => moment(d1).isSame(d2, 'day');
console.log(areDatesTheSame(date1, date2)); // true, даты совпадают
Благодаря Moment.js вы можете использовать более лаконичный и удобный синтаксис, а также расширенные функции для работы с датами.
Визуализация
Представьте объект даты как фрукт: дата — это сущность фрукта, а временная отметка — это его ярлык:
Наши даты подобны фруктам, каждая с своим временным ярлыком:
🍏 (Date1) 🍊 (Date2)
🕒(10:30 утра) 🕔(16:15 дня)
Чтобы сравнить только фрукты, мы убираем ярлыки:
🍏 🍊
(Только дата) (Только дата)
🍏🆚🍊 : **True** — если фрукты одного вида, без учета временных ярлыков.
Сравнение дат как строк
Другой метод сравнения дат заключается в использовании их строковых представлений:
console.log(date1.toDateString() === date2.toDateString()); // true, даты совпадают
Метод toDateString()
возвращает дату в удобночитаемом формате, не включая информацию о времени.
Предупреждение: Проблемы с точностью
Прямое сравнение дат может вызвать проблемы с точностью из-за особенностей високосных секунд и летнего времени. Поэтому важно применять консистентные методы для точного сравнения дат.
Аккуратно с выводом дат в консоль
То, как даты представлены в консоли, может ввести вас в заблуждение, поскольку браузеры могут выводить их в локальной временной зоне. Всегда обращайте внимание на реальные значения объектов дат при их сравнении.
Полезные материалы
- Как сравнить две даты в JavaScript на Stack Overflow – обсуждение методов сравнения дат без учета времени.
- Метод Date.prototype.toDateString() на MDN – упрощение даты до удобного для чтения формата.
- Метод Date.prototype.setHours() на MDN – манипуляции с датой в JavaScript.
- date-fns – современная JavaScript библиотека для работы с датами – подробная документация по использованию.
- Moment.js – документация – официальная документация с обширными функциями для работы с датами.
- Понимание дат и времени в JavaScript от DigitalOcean – подробное руководство.
- GitHub Gist: Сравнение дат в JavaScript от Пола Ириша – код для сравнения частей дат.