Сравните дни, используя объекты Date, не изменяя их - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно сравнить две даты в Javascript, учитывая только день (т.е. не время), но я не хочу изменять исходные объекты даты.

Я придумал:

_isDayGreaterOrEqualThan(date1, date2) {
    const dayDate1 = new Date(date1).setHours(0,0,0,0);
    const comparableDate1 = new Date(dayDate1).getTime();
    const dayDate2 = new Date(date2).setHours(0,0,0,0);
    const comparableDate2 = new Date(dayDate2).getTime();
    return comparableDate1 >= comparableDate2;
}

Есть ли более эффективный способ сделать это без использования внешних библиотек?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете взять отметку времени и усечь ее до кратности 1000 * 60 * 60 * 24, то есть дней в миллисекундах.

_isDayGreaterOrEqualThan(date1, date2) {
    const comp1 = Math.trunc(date1.getTime() / (1000 * 60 * 60 * 24));
    const comp2 = Math.trunc(date2.getTime() / (1000 * 60 * 60 * 24));
    return comp1 >= comp2;
}

В качестве примечания: по соглашению функции компаратора возвращают отрицательное число, если левый аргументменьше правого, положительное число, если правый аргумент меньше левого, и ноль, если они равны (это соглашение, которое, например, Array.sort() использует, если вы передаете функцию в качестве аргумента).Так что вы можете рассмотреть это:

_compareDay(date1, date2) {
    const comp1 = Math.trunc(date1.getTime() / (1000 * 60 * 60 * 24));
    const comp2 = Math.trunc(date2.getTime() / (1000 * 60 * 60 * 24));
    return comp1 - comp2;
}
0 голосов
/ 15 мая 2018

Возможно, это не более эффективно, но более элегантно:

Date.prototype.onlyDate = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

, а затем вы можете спросить:

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