Строковое сравнение дат на JavaScript
Пусть у нас есть две даты в следующем текстовом формате:
let date1 = ‘2020-12-01’; let date2 = ‘2019-12-01’;
В таком случае можно выполнить сравнение этих дат и узнать, какая из этих дат больше:
console.log(date1 > date2); // выведет true
Каким образом происходит сравнение этих дат? Дело в том, что наши даты представляют собой строки и JavaScript сравнивает их как строки. То есть он сначала сравнивает первые символы двух дат: если они одинаковы, то JavaScript сравнивает вторые символы, и так далее, пока не найдет отличия. Благодаря тому, что в нашем формате даты сначала расположен год, потом месяц, а потом день, и возможно такое сравнение.
Дело в том, что если цифра первого года оказывается больше цифры второго года, значит уже не имеет значения, что там с месяцами и днями — первый год точно больше. Если же годы совпадают, то больше будет та дата, у которой больше месяц. А если и месяцы совпадают, то больше будет та дата, у которой больше день. Ну, а если и дни одинаковы, то и даты равны.
Важно также, чтобы даты были в одном формате. В нашем случае разделителями частей дат являются дефисы. Это, конечно же, не обязательно. Например, можно поставить точки:
let date1 = ‘2020.12.01’; let date2 = ‘2019.12.01’;
Или вообще убрать разделители:
let date1 = ‘20201201’; let date2 = ‘20191201’;
Главное, чтобы сравнение было корректным, размещение должно быть следующим: сначала год, потом месяц, потом день.
Напишите код, который сравнит две приведенные ниже даты и выведет сообщение о том, какая из них больше:
Курсы javascript
Я хочу их сравнить и у меня выскакивает везде «no» когда должен выскачить «yes» в последних двух алертах. Как мне его сделать правильно работать?
td
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 24 December 2015 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 1 January 2016 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 30 February 2016 10:10:10 UTC |
20.03.2016, 15:48
Регистрация: 18.05.2011
Сообщений: 1,207
jack3dm,
td
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 24 December 2015 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 1 January 2016 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 30 February 2016 10:10:10 UTC |
20.03.2016, 16:31
Регистрация: 06.04.2015
Сообщений: 52
Намёк понял. Надо распарсить.
Пока что в трёх случаях показывает «yes».
Должно быть так
no
yes
yes
20.03.2016, 16:42
Регистрация: 18.05.2011
Сообщений: 1,207
20.03.2016, 16:47
Регистрация: 06.04.2015
Сообщений: 52
destus,
ой, пересмотрел даты. Всё верно, у меня была ошибка в датах.
Дальше мне нужно сделать так что бы к примеру если разница в * дней то делает такой то алерт. Это нужно создать переменную которая = 15 дней и от неё отталкиваться? Или есть более простой способ?
20.03.2016, 17:02
Регистрация: 18.05.2011
Сообщений: 1,207
jack3dm,
var diff = 15, a = new Date("17 March 2016 11:13:00 UTC"); b = new Date("17 December 2015 11:13:00 UTC"); Math.round((Date.now() - a) / (1000 * 60 * 60 * 24) > diff) ? alert('yes') : alert('no'); Math.round((Date.now() - b) / (1000 * 60 * 60 * 24) > diff) ? alert('yes') : alert('no');
20.03.2016, 17:04
Регистрация: 06.04.2015
Сообщений: 52
destus,
Логику понял. Как только закончу свой код выложу сюда.
Пока не закрывайте топик пожалуйста. Спасибо.
20.03.2016, 17:26
Регистрация: 06.04.2015
Сообщений: 52
destus,
Спасибо за помощь. Вот код. Посоветуй пожалуйста, как можно сделать его более красивым.
td
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 19 March 2016 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 1 March 2016 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 30 January 2016 10:10:10 UTC |
Последний раз редактировалось jack3dm, 20.03.2016 в 17:29 .
20.03.2016, 17:53
Регистрация: 18.05.2011
Сообщений: 1,207
jack3dm,
Вместо того чтобы создавать новый экземпляр класса new Date(), лучше использовать статический метод Date.now() — быстрее. Зачем три раза вычислять одно и тоже 1000 * 60 * 60 * 24 ? Оптимальнее объявить это значение переменной и ссылаться на него дальше. Константы var days15 = 15; days30 = 30; нет смысла объявлять каждый раз при вызове функции.
td
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 19 March 2016 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 1 March 2016 10:10:10 UTC |
Lorem ipsum dolor sit amet | Velit nesciunt explicabo nam | 30 January 2016 10:10:10 UTC |
Сравнение дат без учёта времени в 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 от Пола Ириша – код для сравнения частей дат.
Как сравнить две даты js
Чтобы сравнить даты, можно их преобразовать в объекты Date и сравнить обычным способом. Однако если даты одинаковые, то они не будут равны, так как сравнение идёт по ссылкам. Чтобы добиться корректного сравнения дат, можно использовать метод getTime() :
const firstDate = new Date('2022-03-15'); const secondDate = new Date('2022-03-13'); console.log(firstDate secondDate); // false console.log(firstDate > secondDate); // true const equalDate1 = new Date('2022-03-13'); const equalDate2 = new Date('2022-03-13'); console.log(equalDate1.getTime() == equalDate2.getTime()); // true