Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery datepicker getMinDate '+1d'

Once I have set the minDate property of a datepicker with the convenient string syntax

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

how can I get the date object of the minDate? To help illustrate, there is a method

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

which returns the date that is entered in the input in the format of a date object. I would like the same thing but for datepicker('getMinDate'). There is an option like this

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

but this returns '+1d +3m' which is not helpful. I need the actual date object to compare with another date object. Any ideas?

like image 527
Adrian Adkison Avatar asked May 21 '10 20:05

Adrian Adkison


2 Answers

jQuery uses its _determineDate() function to calculate the minDate date object based on its attribute. I modified its behaviour and made a function. Note that it only deals with the "offset" type of values and nothing else.

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


I originally planned on answering the following, but came up with a (better) solution - the one above. However, I'm going to include it, in case it's needed for debugging reasons etc.

The _determineDate() function is technically availible for use, but it's not supposed to be used and may change in the future. Nevertheless, this would be how to use it:

var minDateAttr = $(elem).datepicker("option", "minDate");
var inst = $(elem).data("datepicker");
var minDateObj = $.datepicker._determineDate(inst, minDateAttr, new Date());
like image 72
Simen Echholt Avatar answered Sep 20 '22 02:09

Simen Echholt


This update fixes a few bugs surrounding month calculation bugs, hours and leap years. Big props to Simen for the first version which was the foundation.

Also this version will allow for optional second param dateVal where you can pass a date to calculate from instead of using today's date.

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();
}
like image 35
Dan Avatar answered Sep 22 '22 02:09

Dan