Сравнение дат без учёта времени в 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 от Пола Ириша – код для сравнения частей дат.