jQuery datepicker getMinDate’+ 1d’
一旦我使用方便的字符串语法设置了datepicker的minDate属性
$(elem).datepicker('option','minDate','+1d +3m');
如何获取minDate的日期对象? 为了帮助说明,有一种方法
$(elem).datepicker('getDate');
它以日期对象的格式返回输入中输入的日期。 我想同样的事情,但对于datepicker(’getMinDate’)。 有一个像这样的选项
$(elem).datepicker('option','minDate');
但这会返回“+ 1d + 3m”,这没有用。 我需要实际的日期对象来与另一个日期对象进行比较。 有任何想法吗?
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());
此更新修复了月计算错误,小时和闰年的一些错误。 作为基础的第一个版本的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(); }