jQuery datepicker getMinDate'+ 1d'

时间:2010-05-21 20:22:59

标签: jquery datepicker

我使用方便的字符串语法

设置了datepicker的minDate属性
$(elem).datepicker('option','minDate','+1d +3m'); 

如何获取minDate的日期对象?为了帮助说明,有一种方法

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

以日期对象的格式返回输入中输入的日期。我想要同样的事情,但对于datepicker('getMinDate')。有这样的选项

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

但这会返回“+ 1d + 3m”,这没有用。我需要实际的日期对象来与另一个日期对象进行比较。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

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;
}

<小时/> 我最初计划回答以下内容,但提出了一个(更好的)解决方案 - 上面的解决方案。但是,我将包含它,以防出于调试原因等需要。

_determineDate()函数在技术上可以使用,但它不应该被使用,并且可能在将来发生变化。然而,这将是如何使用它:

var minDateAttr = $(elem).datepicker("option", "minDate");
var inst = $(elem).data("datepicker");
var minDateObj = $.datepicker._determineDate(inst, minDateAttr, new Date());

答案 1 :(得分:1)

此更新解决了围绕月计算错误,小时和闰年的一些错误。作为基础的第一个版本,Simen的大道具。

此版本还允许使用可选的第二个参数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();
}