Как сравнить даты в JS (JavaScript)

Как сравнить даты в JS (JavaScript)

23.02.2024
266
15 мин.
0

Сравнение дат — обычная задача, которая может показаться на первый взгляд сложной, если не знать, как лучше справиться с ней. Что необходимо учитывать, прежде чем разобраться, как сравнить даты в JS. Следует принимать во внимание такие факторы, как формат, часовой пояс, точность и цель сравнения.

В этой статье мы рассмотрим в частности:

  1. Методы и советы по сравнению дат.
  2. Сравнение дат без учёта времени.
  3. Сравнение дат и времени.
  4. Как проверить две даты на совпадение.
  5. Работу с разными часовыми поясами при сравнении дат.
  6. Использование библиотек для упрощения этого процесса.

Основной способ сравнения дат в JavaScript

Как правило, это можно легко сделать с помощью объекта Date и метода getTime(). Это лучшие инструменты для работы с датами и временем в JavaScript. Объект Date — это особый вид объекта, который хранит дату и время. При создании нового объекта Date можно присвоить ему строку, число или вообще ничего. Например:

let date1 = new Date();             // Текущая дата и время
let date2 = new Date("6/01/2022");  // Конкретная дата в строковом формате
let date3 = new Date(2022, 5, 1);   // Конкретная дата (год, месяц, день)

Собственно говоря, метод getTime() — замечательный способ работы с датами в JavaScript. Он выдаёт число, представляющее точный момент времени, когда был создан объект Date. Это число представляет собой количество прошедших миллисекунд с 1 января 1970 года. Это особая дата в информатике. Почему это число так важно? Оно позволяет легко сравнивать разные даты друг с другом, используя простую математику. Например:

let date1 = new Date();
let date2 = new Date("6/01/2022");
let date3 = new Date(2022, 5, 1);

console.log(date1.getTime() > date2.getTime());  // false
console.log(date2.getTime() == date3.getTime()); // true
console.log(date3.getTime() < date1.getTime());  // false

Сравнивать даты легко с помощью конструктора дат и метода getTime(). Для дат можно использовать любой формат. Никакие дополнительные библиотеки типа moment.js не являются обязательными. Наоборот, они могут только увеличить объём кода.

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

Как сравнивать даты в JavaScript, не заботясь о времени? Это может понадобиться для задач, где требуется только работа с датами. Точнее говоря, есть два способа сделать это: со строковым или числовым форматом.

Как сравнить даты в JS без учёта времени через строки

Достаточно просто превратить объекты Date в строки, которые содержат только дату. Для этого следует использовать метод toDateString(). Он выдаёт строковые данные. Например:

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000
let date1String = date1.toDateString();           // 'Tue Jan 29 2024'
let date2String = date2.toDateString();           // 'Tue Jan 29 2024'

Теперь можно сравнить строки, используя операторы сравнения (<, >, == и т.д.). Как видно из этого примера, строки равны, потому что у них одинаковая дата, хотя время разное.

Сравнение дат без учёта времени через числа

Также можно сравнивать даты без учёта времени, преобразовывая их в числа. Эти числа показывают, сколько миллисекунд прошло с 1 января 1970 года. Получить эти числа можно с помощью метода getTime(), который выдаёт данные в миллисекундах. Например:

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000
let date1Number = date1.getTime();                // 1709286888000
let date2Number = date2.getTime();                // 1709332800000

Теперь можно применить операторы сравнения (<, >, == и т.д.).

console.log(date1Number === date2Number);   // Output: false
console.log(date1Number < date2Number);     // Output: true
console.log(date1Number > date2Number);     // Output: false

Если взглянуть на эти цифры, то видно, что они не совпадают. Всё дело в том, что у них разное время, хотя даты одинаковые.

Но как сравнить даты в JS без использования чисел? Это возможно, округлив миллисекунды в меньшую сторону до ближайшего дня. Для этого потребуется функция Math.floor() . Она выдаёт наибольшее целое число, которое меньше или равно исходному. Например:

let date1 = new Date('2024-01-29T03:34:48.000Z');  // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000
let date1Number = date1.getTime();                // 1709286888000
let date2Number = date2.getTime();                // 1709332800000
let numberOfMillisecondsPerDay = (1000 * 60 * 60 * 24);

let date1Day = Math.floor(date1Number / numberOfMillisecondsPerDay); // Результат: 19767
let date2Day = Math.floor(date2Number / numberOfMillisecondsPerDay); // Результат: 19767

Теперь можно использовать операторы сравнения (<, >, == и т.д.).

console.log(date1Day === date2Day); // Результат: true
console.log(date1Day < date2Day);   // Результат: false
console.log(date1Day > date2Day);   // Результат: false

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

Как сравнивать даты с учётом времени в JavaScript

Иногда требуется сравнить даты и время. Это удобно, когда требуется получить точную дату, а не только день. Например, может потребоваться узнать, началось ли, закончилось или все ещё продолжается событие, истёк ли крайний срок или он скоро наступит.

Сравнивать даты и время в JavaScript можно двумя основными способами: с помощью строк или чисел. Давайте узнаем, как они работают.

Сравнение дат со временем с помощью строк

Можно сравнивать даты со временем, используя строки в формате ISO 8601. Их легко читать и понимать. Они выглядят как yyyy-mm-dd hh:mm:ss. Например:

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000
let date1String = date1.toISOString();            // '2024-01-29T03:34:48.000Z'
let date2String = date2.toISOString();            // '2024-01-29T15:00:00.000Z'

Далее можно использовать операторы сравнения (<, >, == и т.д.).

console.log(date1String === date2String); // Результат: false
console.log(date1String < date2String);   // Результат: true
console.log(date1String > date2String);   // Результат: false

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

Как сравнить даты в JS со временем с использованием чисел

Это достаточно интересный способ сравнения дат путём преобразования их в числа. Достаточно просто использовать метод getTime(). Он выдаёт число, которое означает «как много миллисекунд прошло с 1 января 1970 года».

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000
let date1Number = date1.getTime();                // 1709286888000
let date2Number = date2.getTime();  

Следующим шагом является применение операторов сравнения (<, >, == и т.д.).

console.log(date1Number === date2Number); // Результат: false
console.log(date1Number < date2Number);   // Результат: true
console.log(date1Number > date2Number);   // Результат: false

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

Сравнение дат по дням в JavaScript

Как сравнить даты в JS (JavaScript)
Даты в JavaScript можно сравнивать различными способами (изображение создано с помощью ИИ)

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

Как сравнить даты в JS с использованием компонентов Date

Один из способов сравнения даты по дням —использовать компоненты даты, такие как день недели, месяц и год объекта Date. Их можно получить с помощью методов getDate(), getDay(), getMonth() и getFullYear(), которые возвращают числа в формате «день», «день недели», «месяц» и «год». Например:

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000

let date1Day = date1.getDate();                   // 29
let date1Weekday = date1.getDay();                // 2
let date1Month = date1.getMonth();                // 0
let date1Year = date1.getFullYear();              // 2024

let date2Day = date2.getDate();                   // 29
let date2Weekday = date2.getDay();                // 2
let date2Month = date2.getMonth();                // 0
let date2Year = date2.getFullYear();              // 2024

Далее применим операторы сравнения (<, >, == и т.д.).

console.log(date1Day === date2Day);         // Результат: true
console.log(date1Weekday === date2Weekday); // Результат: true
console.log(date1Month === date2Month);     // Результат: true
console.log(date1Year === date2Year);       // Результат: true

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

Как сравнить даты в JS в разных часовых поясах

Для этого просто нужно получить разницу в минутах между местным временем и UTC (Universal Time). Как же её получить? Потребуется метод getTimezoneOffset().

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000
let date1Offset = date1.getTimezoneOffset();      // 0
let date2Offset = date2.getTimezoneOffset();      // 0

Как необходимо сравнивать даты в разных часовых поясах? Допустим, date1 находится в Индии, а date2 — в Японии. Индия на 5,5 часов опережает время по UTC, а Япония — на 9 часов. Итак, смещение часового пояса для date1 равно +05:30, а для date2 — +09:00. Это означает, что date1 и date2 имеют разные смещения от UTC.

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000

let date1Offset = date1.getTimezoneOffset();      // 0
let date2Offset = date2.getTimezoneOffset();      // 0

// Adjust the dates to the local time zones
date1.setTime(date1.getTime() + date1Offset * 60 * 1000); // Tue Jan 29 2024 09:04:48 GMT+0530
date2.setTime(date2.getTime() + date2Offset * 60 * 1000); // Tue Jan 29 2024 18:00:00 GMT+0900

// Получаем новые смещения часовых поясов
date1Offset = date1.getTimezoneOffset();        // -330
date2Offset = date2.getTimezoneOffset();        // -540

Date1 на 330 минут опережает мировое время, поэтому смещение равно -330. Date2 — 540 минут. Его смещение составляет -540.

Затем используем операторы сравнения (<, >, == и т.д.).

console.log(date1 === date2); // Результат: false
console.log(date1 < date2);   // Результат: true
console.log(date1 > date2);   // Результат: false

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

Как сравнить даты в JS с использованием библиотек

Без всякого сомнения сравнивать даты в JavaScript может быть иногда непростой задачей. Исходя из того, что существуют несколько сторонних библиотек, этот процесс можно существенно упростить.

Moment.js

Moment.js позволяет совершать удивительные вещи с датами и временем в JavaScript. С её помощью можно легко сравнивать, изменять и форматировать даты различными способами. Например, «today is Monday» или «3 hours ago» или «12/31/2020». Для начала ее надо импортировать в проект.

// Установка Moment.js через npm
npm install moment

// Импортирование Moment.js в JavaScript файл
const moment = require('moment');

Достаточно просто создать объекты moment из объектов данных, строк или чисел. А встроенная функция moment() может работать с любыми аргументами или форматами.

let date1 = new Date('2024-01-29T03:34:48.000Z'); // Tue Jan 29 2024 03:34:48 GMT+0000
let date2 = new Date('2024-01-29T15:00:00.000Z'); // Tue Jan 29 2024 15:00:00 GMT+0000

// Создание объекта moment из объекта даты
let moment1 = moment(date1); 
let moment2 = moment(date2);

// Создание объекта moment из строки в формате ISO 8601
let moment3 = moment('2024-01-29T03:34:48.000Z'); 
let moment4 = moment('2024-01-29T15:00:00.000Z'); 

// Создание объекта moment из числа в миллисекундах
let moment5 = moment(1709286888000); 
let moment6 = moment(1709332800000);

Эта библиотека позволяет проделывать удивительные вещи с датами, используя простые встроенные методы, такие как isBefore(), isAfter(), is Same() и другие. Они возвращают true или false.

console.log(moment1.isBefore(moment2));       // Результат: true
console.log(moment1.isAfter(moment2));        // Результат: false
console.log(moment1.isSame(moment2));         // Результат: false
console.log(moment1.isSameOrBefore(moment2)); // Результат: true
console.log(moment1.isSameOrAfter(moment2));  // Результат: false

При сравнении объектов библиотека использует время UTC, точно так же, как объект Date. В частности, она позволяет сравнивать дату с местной или в другом часовом поясе. Изменение часового пояса доступно с помощью функций local() или utcOffset().

Day.js

Day.js предоставляет возможность легко и быстро работать с датами и временем. Она похожа на Moment.js, но меньше по объёму и быстрее. Для неё также имеется множество плагинов, которые добавляют больше функций и опций. Например, можно указать что-то вроде «today is before yesterday» или «3 hours ago» или «12/31/2020». Импортировать её в свой проект тоже не составит труда.

// Установка Day.js через npm
npm install dayjs

// Импортирование Day.js в JavaScript файл
const dayjs = require('dayjs');

Библиотека отлично подходит для сравнения дат. Достаточно просто создавать объекты days из любых дат. Функция dayjs() работает с разными входными данными и форматами.

let date1 = new Date('2024-01-29T03:34:48.000Z'); 
// Tue Jan 29 2024 03:34:48 GMT+0000

let date2 = new Date('2024-01-29T15:00:00.000Z'); 
// Tue Jan 29 2024 15:00:00 GMT+0000

// Создаём объект dayjs объекта даты
let day1 = dayjs(date1); 
let day2 = dayjs(date2);

// Создаём объект dayjs из строки в формате ISO 8601
let day3 = dayjs('2024-01-29T03:34:48.000Z'); 
let day4 = dayjs('2024-01-29T15:00:00.000Z');

// Создаём объект dayjs из числа в миллисекундах
let day5 = dayjs(1709286888000); 
let day6 = dayjs(1709332800000);

Сравнивать объекты days с помощью Day.js очень просто. В библиотеке есть потрясающие методы, такие как isBefore(), after(), some() и многие другие. Они возвращают true или false. Например:

consol.log(day1.isBefore(day2)); 		// Результат: true
consol.log(day1.isAfter(day2)); 		// Результат: false
consol.log(day1.isSame(day2)); 			// Результат: false
consol.log(day1.isSameOrBefore(day2)); 	// Результат: true
consol.log(day1.isSameOrAfter(day2)); 	// Результат: false

Объекты в Dayjs и объекты Date имеют одинаковое время UTC. Иногда требуется получить другой часовой пояс. В этом случае потребуются методы local() или utcOffset() чтобы изменить Dayjs, указав нужный часовой пояс.

Date-fns

Date-fns — современная модульная библиотека, которая позволяет проделывать удивительные вещи с датами и временем. С её помощью можно анализировать даты, сортировать их и форматировать любым удобным способом. Также доступны плагины для добавления дополнительных функций, таких как сравнение естественного языка, относительного времени или пользовательских форматов.

Установить её также не сложно:

// Установка date-fns через npm
npm install date-fns

// Импортирование date-fns в JavaScript файл
const { compareAsc, compareDesc, format, 
	formatDistance, formatRelative, isAfter, 
	isBefore, isEqual, isSameDay, 
	isSameMonth, isSameYear } = require('date-fns');

Сравнивать даты с date-aty можно различными способами, используя объекты, строки или числа. Чтобы создать объекты данных из строки или числа, надо применить объект Date или parseIO().

let date1 = new Date('2024-01-29T03:34:48.000Z'); 
// Tue Jan 29 2024 03:34:48 GMT+0000

let date2 = new Date('2024-01-29T15:00:00.000Z'); 
// Tue Jan 29 2024 15:00:00 GMT+0000

let date3 = parseISO('2024-01-29T03:34:48.000Z'); 
// Tue Jan 29 2024 03:34:48 GMT+0000

let date4 = parseISO('2024-01-29T15:00:00.000Z'); 
// Tue Jan 29 2024 15:00:00 GMT+0000

let date5 = parseISO(1709286888000); 
// Tue Jan 29 2024 03:34:48 GMT+0000

let date6 = parseISO(1709332800000); 
// Tue Jan 29 2024 15:00:00 GMT+0000

Вне сомнения, эта библиотека имеет множество удобных функций, таких как compareAsc(), compareDesc(), isAfter(), before(), isEqual() и многие другие. Как положено в этом случае они возвращают значение true или false. Например:

console.log(compareAsc(date1, date2)); 	// Результат: -1
console.log(compareDesc(date1, date2)); // Результат: 1
console.log(isAfter(date1, date2)); 	// Результат: false
console.log(isBefore(date1, date2)); 	// Результат: true
console.log(isEqual(date1, date2)); 	// Результат: false
console.log(isSameDay(date1, date2)); 	// Результат: true
console.log(isSameMonth(date1, date2)); // Результат: true
console.log(isSameYear(date1, date2)); 	// Результат: true

При необходимости использовать местное время или другой часовой пояс достаточно использовать utcToZonedTime() или zonedTimeToUtc(). Эти функции могут изменить объекты даты на требуемый часовой пояс.

Читайте также: Опциональная цепочка в JavaScript.

Заключение

Как видно из этой статьи, проблема, как сравнить даты в JS не является такой уж сложной задачей. Само собой разумеется, её можно решить как на нативном JavaScript, так и прибегнув к помощи библиотек.