我使用方便的字符串语法
设置了datepicker的minDate属性$(elem).datepicker('option','minDate','+1d +3m');
如何获取minDate的日期对象?为了帮助说明,有一种方法
$(elem).datepicker('getDate');
以日期对象的格式返回输入中输入的日期。我想要同样的事情,但对于datepicker('getMinDate')。有这样的选项
$(elem).datepicker('option','minDate');
但这会返回“+ 1d + 3m”,这没有用。我需要实际的日期对象来与另一个日期对象进行比较。有什么想法吗?
答案 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();
}