Сравнение дат в JScript

Доброго времени суток!
Хочу поделиться функцией с расширенными возможностями по сравнению дат. В специфике моих текущих задач вопросы сравнения дат весьма и весьма актуальны. Я решил, что настало время написать простенькую и универсальную функцию по сравнению дат. Ее особенность в том, что можно задать формат сравнения, тоесть, что именно в датах сравнить.
Для этого обьявим несколько констант (формат сравнения даты):

var dcfYear = 1;
var dcfMonth = 2;
var dcfDate = 4;
var dcfWeekDay = 8;
var dcfHours = 16;
var dcfMinutes = 32;
var dcfSeconds = 64;
var dcfMilliseconds = 128;
var dcfFullDate = dcfYear + dcfMonth + dcfDate;
var dcfTime = dcfHours + dcfMinutes + dcfSeconds;
var dcfFullDateTime = dcfFullDate + dcfTime;

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

 var WeekDayHoursCompareFormat = dcfWeekDay  + dcfHours.

Сама функция выглядит следующим незамысловатым образом:

function AreDateTimeValuesEqualEx(DateTime1, DateTime2, DateComparingFormat) {
    var Date1 = new Date(DateTime1);
    var Date2 = new Date(DateTime2);
// Следующая строчка нужна для задания значения по умолчанию, если значение параметра неопределено
    DateComparingFormat = DateComparingFormat || dcfFullDateTime;
    var Result = true;
    if (DateComparingFormat & dcfYear) {
        Result = Result && (Date1.getFullYear() == Date2.getFullYear());
    }
    if (DateComparingFormat & dcfMonth) {
        Result = Result && (Date1.getMonth() == Date2.getMonth());
    }
    if (DateComparingFormat & dcfDate) {
        Result = Result && (Date1.getDate() == Date2.getDate());
    }
    if (DateComparingFormat & dcfWeekDay) {
        Result = Result && (Date1.getDay() == Date2.getDay());
    }
    if (DateComparingFormat & dcfHours) {
        Result = Result && (Date1.getHours() == Date2.getHours());
    }
    if (DateComparingFormat & dcfMinutes) {
        Result = Result && (Date1.getMinutes() == Date2.getMinutes());
    }
    if (DateComparingFormat & dcfSeconds) {
        Result = Result && (Date1.getSeconds() == Date2.getSeconds());
    }
    if (DateComparingFormat & dcfMilliseconds) {
        Result = Result && (Date1.getMilliseconds() == Date2.getMilliseconds());
    }
    return Result;
}

Возможно, кто-то знает как этот процесс можно оптимизировать. Жду комментариев!

Нравится

Поделиться

6 комментариев

Константин, а Вам не кажется, что Вашу функцию можно несколько оптимизировать. В том случае, если попали в if и Result = false, то из функции можно смело выходить.

Конечно! Должен же я был оставить простор для тех, кто прочитает :) Спасибо за интерес к теме!

Красиво отмазались :) Ну тогда еще добавлю что нужно порядок сравнений поменять - соответственно частоте сравнения. Сначала часы-минуты-секунды, потом годы-дни-месяцы, потом дни недели, потом милисекунды.

Вы же, вроде, в предыдущем посте писали про изменение порядка условий согласно частоте использования? :) В любом случае замечания конструктивные, благодарю!

Где писал? Не вижу.

Пока я не нажал обновить, в первом сообщении было 3 строчки, а сейчас - две. Ну не важно, проехали. Главное, что ничего не потерялось и смысл весь в переписке сохранен.

Показать все комментарии