Сравнение только части даты без сравнения времени в JavaScript - PullRequest
339 голосов
/ 23 апреля 2010

Что не так с кодом ниже?

Может быть, было бы проще сравнить дату, а не время. Я тоже не уверен, как это сделать, и я искал, но не смог найти свою точную проблему.

Кстати, когда я отображаю две даты в предупреждении, они отображаются одинаково.

Мой код:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Есть ли более простой способ сравнения дат без учета времени?

Ответы [ 20 ]

2 голосов
/ 21 января 2014

После прочтения этого вопроса почти сразу же после его публикации я решил опубликовать другое решение, поскольку я не нашел его вполне удовлетворительным, по крайней мере для моих потребностей:

Я использовал что-то вродеthis:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

Таким образом, я мог бы использовать даты в том формате, который я хотел потом обработать.Но это было только для моей необходимости, но я все равно решил опубликовать это, может быть, это кому-то поможет

1 голос
/ 21 апреля 2019

Если вы действительно сравниваете дату только с отсутствующим временным компонентом, другое решение, которое может показаться неправильным, но работает и избегает всех Date() временных и часовых поясов, заключается в сравнении строки ISO непосредственно с использованием сравнения строк:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Вы можете получить текущую дату (дату UTC, не обязательно локальную дату пользователя), используя:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Мой аргумент в пользу этого - простота программиста - вы гораздо меньше рискуете ошибиться, чем пытаться правильно обрабатывать время и смещение, вероятно, за счет скорости (я не сравнивал производительность)

1 голос
/ 23 апреля 2010

Убедитесь, что вы строите userDate с четырехзначным годом как setFullYear(10, ...) !== setFullYear(2010, ...).

1 голос
/ 27 января 2016

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

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

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

Надеюсь, это поможет!

0 голосов
/ 16 мая 2019

Просто используйте toDateString () в обе даты. toDateString не включает время, поэтому для 2 раз в одну и ту же дату значения будут одинаковыми, как показано ниже.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

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

0 голосов
/ 01 мая 2019

Этот JS изменит содержимое после установленной даты. Здесь то же самое, но в w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->
0 голосов
/ 26 февраля 2019
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

если формат даты отличается, используйте библиотеку moment.js , чтобы преобразовать формат даты, а затем используйте вышеуказанный код для сравнения двух дат

Пример:

Если ваша Дата указана в формате «ДД / ММ / ГГГГ» и требуется преобразовать ее в «ММ / ДД / ГГГГ», см. Пример кода ниже

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0 голосов
/ 23 февраля 2019

Сравнение с setHours() будет решением.Образец:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}
0 голосов
/ 28 июня 2018

Это поможет. Мне удалось получить это так.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
0 голосов
/ 05 января 2018

Я знаю, что на этот вопрос уже был дан ответ, и, возможно, это не самый лучший способ, но в моем сценарии он работает отлично, поэтому я подумал, что он может помочь кому-то, как я.

если у вас date string как

String dateString="2018-01-01T18:19:12.543";

и вы просто хотите сравнить часть даты с другим объектом Date в JS,

var anotherDate=new Date(); //some date

, тогда у вас естьconvert string до Date объекта с использованием new Date("2018-01-01T18:19:12.543");

и вот хитрость: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

Я использовал toDateString() из Date objectJS, который возвращает только строку даты.

Примечание: не забывайте использовать функцию .valueOf() при сравнении дат.

больше информации о .valeOf() здесь ссылка

Счастливая кодировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...