2010-05-21 4 views
7

После того, как я установил свойство MinDate в виде DatePicker с удобным синтаксисом строкиJQuery DatePicker getMinDate «+ 1d»

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

, как я могу получить объект даты в MinDate? Для того, чтобы проиллюстрировать, существует метод

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

, который возвращает дату, которая вводится на входе в формате объекта даты. Мне хотелось бы то же самое, но для datepicker ('getMinDate'). Существует такой вариант, как этот

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

, но это возвращает '+ 1d + 3m', что не помогает. Мне нужен фактический объект даты для сравнения с другим объектом даты. Есть идеи?

+0

Я хочу добавить, что, когда один задает MinDate с DatePicker, JQuery UI должен разобрать объект даты, чтобы создать диапазон дат, которые пользователь может выбрать в пользовательском интерфейсе. Является ли этот объект даты MinDate, который был рассчитан, доступным каким-либо образом, действительно является тем, что я прошу. –

ответ

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()); 
+0

Ничего себе, Stackoverflow, ты никогда не перестаешь меня удивлять. Отлично! Я предпочел бы первое решение. Ненависть отрывается от путей обновления фреймворка :). –

+0

Согласовано это удивительно. Мы используем это в проекте, и возможно, ошибка связана с нашим кодом или часовым поясом, но сегодня 8/30/2012, если я передаю -6m этой функции, я получаю 3/01/2012. Хотя, если я использую $ .datepicker («setDate», «-6m») на datepicker с датой сегодняшнего дня, я получаю 2/29/2012. Это может быть ошибка високосного года? – Dan

+0

другая заметка, сменившая компьютерные часы на 8/30/2011, и та же проблема возникает, поэтому она не связана с високосным годом, а возникает, когда текущая дата больше, чем количество дней в целевом месяце. как-то версия jquery ui решает это, но, глядя на источник, не может понять, как это сделать. – Dan

1

Это обновление исправляет несколько ошибок окружающих вычислений месяца ошибку, часы и високосные года. Большой реквизит для Simen для первой версии, которая была основой.

Также в этой версии будет предоставлен необязательный второй param 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(); 
}