Какое сравнение двух дат правильное js
Перейти к содержимому

Какое сравнение двух дат правильное js

  • автор:

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

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

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

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

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

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

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

Как сравнить две даты 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 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *