jQuery datepicker getMinDate '+ 1d' - PullRequest
7 голосов
/ 22 мая 2010

Как только я установил свойство minDate для средства выбора даты с удобным синтаксисом строки

$(elem).datepicker('option','minDate','+1d +3m'); 

как я могу получить объект даты minDate? Чтобы проиллюстрировать это, есть метод

 $(elem).datepicker('getDate');

, который возвращает дату, введенную во входные данные в формате объекта даты. Я хотел бы то же самое, но для datepicker ('getMinDate'). Есть такая опция

$(elem).datepicker('option','minDate');

но это возвращает «+ 1d + 3m», что бесполезно. Мне нужен фактический объект даты для сравнения с другим объектом даты. Есть идеи?

Ответы [ 2 ]

7 голосов
/ 22 мая 2010

jQuery использует функцию _determineDate() для вычисления объекта даты minDate на основе его атрибута.Я изменил его поведение и сделал функцию.Обратите внимание, что он имеет дело только со значениями типа «смещение» и ничего больше.

/* minDateAttr is the minDate option of the datepicker, eg '+1d +3m' */
function getMinDate(minDateAttr) {
    var minDate = new Date();
    var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
    var matches = pattern.exec(minDateAttr);
    while (matches) {
        switch (matches[2] || 'd') {
            case 'd' : case 'D' :
                minDate.setDate(minDate.getDate() + parseInt(matches[1],10));
                break;
            case 'w' : case 'W' :
                minDate.setDate(minDate.getDate() + parseInt(matches[1],10) * 7);
                break;
            case 'm' : case 'M' :
                minDate.setMonth(minDate.getMonth() + parseInt(matches[1],10));
                break;
            case 'y': case 'Y' :
                minDate.setYear(minDate.getFullYear() + parseInt(matches[1],10));
                break;
        }
        matches = pattern.exec(minDateAttr);
    }
    return minDate;
}

Изначально я планировал ответить на следующее, но придумал (лучшее) решение - приведенное выше.Тем не менее, я собираюсь включить его, на случай, если это необходимо по причинам отладки и т. Д.будущее.Тем не менее, это было бы, как использовать это:

var minDateAttr = $(elem).datepicker("option", "minDate");
var inst = $(elem).data("datepicker");
var minDateObj = $.datepicker._determineDate(inst, minDateAttr, new Date());
1 голос
/ 31 августа 2012

Это обновление исправляет несколько ошибок, связанных с ошибками расчета месяца, часов и високосных лет. Большой реквизит Симен для первой версии, которая была основой.

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

function determineDate(dateAttr, dateVal) {
    var date = dateVal === undefined ? new Date() : new Date(dateVal);
    var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
    var matches = pattern.exec(dateAttr);

    var year = date.getFullYear();
    var month = date.getMonth();
    var day = date.getDate();

    while (matches) {
        switch (matches[2] || 'd') {
            case 'd' : case 'D' :
                day += parseInt(matches[1],10); break;
            case 'w' : case 'W' :
                day += parseInt(matches[1],10) * 7; break;
            case 'm' : case 'M' :
                month += parseInt(matches[1],10);
                day = Math.min(day, getDaysInMonth(year, month));
                break;
            case 'y': case 'Y' :
                year += parseInt(matches[1],10);
                day = Math.min(day, getDaysInMonth(year, month));
                break;
        }
        matches = pattern.exec(dateAttr);
    }

    var newdate =  new Date(year, month, day);

    newdate.setHours(0);
    newdate.setMinutes(0);
    newdate.setSeconds(0);
    newdate.setMilliseconds(0);


    return daylightSavingAdjust(newdate);

}

function daylightSavingAdjust(date){
    if (!date){
        return null;
    }
    date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
    return date;
}

function getDaysInMonth(year, month){
    return 32 - daylightSavingAdjust(new Date(year, month, 32)).getDate();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...