Доброго времени суток!
Хочу поделиться функцией с расширенными возможностями по сравнению дат. В специфике моих текущих задач вопросы сравнения дат весьма и весьма актуальны. Я решил, что настало время написать простенькую и универсальную функцию по сравнению дат. Ее особенность в том, что можно задать формат сравнения, тоесть, что именно в датах сравнить.
Для этого обьявим несколько констант (формат сравнения даты):
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;
}
Возможно, кто-то знает как этот процесс можно оптимизировать. Жду комментариев!
Константин, а Вам не кажется, что Вашу функцию можно несколько оптимизировать. В том случае, если попали в if и Result = false, то из функции можно смело выходить.
Конечно! Должен же я был оставить простор для тех, кто прочитает :) Спасибо за интерес к теме!
Красиво отмазались :) Ну тогда еще добавлю что нужно порядок сравнений поменять - соответственно частоте сравнения. Сначала часы-минуты-секунды, потом годы-дни-месяцы, потом дни недели, потом милисекунды.
Вы же, вроде, в предыдущем посте писали про изменение порядка условий согласно частоте использования? :) В любом случае замечания конструктивные, благодарю!
Пока я не нажал обновить, в первом сообщении было 3 строчки, а сейчас - две. Ну не важно, проехали. Главное, что ничего не потерялось и смысл весь в переписке сохранен.