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?
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;
}
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());
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();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With