ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Сравнение дат без учёта времени в JavaScript: решение

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

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

Если вы хотите сравнить только даты, не принимая во внимание время, вы можете установить время на начало суток для каждой из сравниваемых дат и сравнить их числовые представления (timestamp):

JS
Скопировать код
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), устанавливающий время на полночь, помогает исключить разницу во времени при сравнении дат.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Особенности работы с часовыми поясами

Когда дело доходит до работы с часовыми поясами, важно производить сравнение дат, предварительно приведя их к универсального времени (UTC):

JS
Скопировать код
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
};

Это подход устраняет различия между часовыми поясами и обеспечивает точное сравнение дат.

Сравнение дат через их сериализацию

Вы также можете сериализовать даты в строковый формат и сравнивать полученные строки:

JS
Скопировать код
const serializeDate = (date) => date.toISOString().split('T')[0];
console.log(serializeDate(date1) === serializeDate(date2)); // true, даты совпадают

Сериализация даты в строковое представление обеспечивает возможность сравнивать даты, исключив из учёта время и временные зоны.

Дополнительные возможности при работе с объектами Date

Если в вашем процессе разработки встречается необходимость в сравнении дат, может быть полезно добавить метод в прототип Date:

JS
Скопировать код
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, могут оказаться полезными при выполнении сложных операций над временем:

JS
Скопировать код
const moment = require('moment');

const areDatesTheSame = (d1, d2) => moment(d1).isSame(d2, 'day');

console.log(areDatesTheSame(date1, date2)); // true, даты совпадают

Благодаря Moment.js вы можете использовать более лаконичный и удобный синтаксис, а также расширенные функции для работы с датами.

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

Представьте объект даты как фрукт: дата — это сущность фрукта, а временная отметка — это его ярлык:

Markdown
Скопировать код
Наши даты подобны фруктам, каждая с своим временным ярлыком:
plaintext
Скопировать код
            🍏 (Date1)            🍊 (Date2)
        🕒(10:30 утра)      🕔(16:15 дня)
Markdown
Скопировать код
Чтобы сравнить только фрукты, мы убираем ярлыки:
plaintext
Скопировать код
            🍏                  🍊
       (Только дата)       (Только дата)
Markdown
Скопировать код
🍏🆚🍊 : **True** — если фрукты одного вида, без учета временных ярлыков.

Сравнение дат как строк

Другой метод сравнения дат заключается в использовании их строковых представлений:

JS
Скопировать код
console.log(date1.toDateString() === date2.toDateString()); // true, даты совпадают

Метод toDateString() возвращает дату в удобночитаемом формате, не включая информацию о времени.

Предупреждение: Проблемы с точностью

Прямое сравнение дат может вызвать проблемы с точностью из-за особенностей високосных секунд и летнего времени. Поэтому важно применять консистентные методы для точного сравнения дат.

Аккуратно с выводом дат в консоль

То, как даты представлены в консоли, может ввести вас в заблуждение, поскольку браузеры могут выводить их в локальной временной зоне. Всегда обращайте внимание на реальные значения объектов дат при их сравнении.

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

  1. Как сравнить две даты в JavaScript на Stack Overflow – обсуждение методов сравнения дат без учета времени.
  2. Метод Date.prototype.toDateString() на MDN – упрощение даты до удобного для чтения формата.
  3. Метод Date.prototype.setHours() на MDN – манипуляции с датой в JavaScript.
  4. date-fns – современная JavaScript библиотека для работы с датами – подробная документация по использованию.
  5. Moment.js – документация – официальная документация с обширными функциями для работы с датами.
  6. Понимание дат и времени в JavaScript от DigitalOcean – подробное руководство.
  7. GitHub Gist: Сравнение дат в JavaScript от Пола Ириша – код для сравнения частей дат.