DatePicker禁用国庆日+ 48小时+周末

时间:2015-09-22 07:45:52

标签: javascript jquery datepicker

我知道,标题并不是非常具体,但我对DatePicker有疑问。我尝试禁用国家日,周末和今天后48小时。目前我这样做了:

  • 今天隐藏+ 48小时,我使用minDate: 3
  • 隐藏周末
  • 隐藏国庆日,将其保存在数组中
  • 隐藏(今天+ 48小时)+周末(禁用5天),beforeShow属性中的代码

我的代码目前看起来像这样:

function noWeekendsOrHolidays(date) {
    var dateTime = new Date();
    var dayOfWeek = dateTime.getDay();
    var noWeekend = $.datepicker.noWeekends(date);

    if (noWeekend[0]) {
        natDays = [
            [1, 1, 'au'], [5, 1, 'ar'], [5, 8, 'ar'], [7, 14, 'us'], [8, 15, 'id'], [11, 1, 'lb'], [11, 11, 'lb'], [12, 25, 'ke']
        ];

        for (i = 0; i < natDays.length; i++) {
            if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
                return [false, ''];
            }
        }
        return [true, ''];
    } else {
        return noWeekend;
    }
}

function addDatePicker(pSelname)
{
    $(pSelname).datepicker({
        stepMonths: 1,
        firstDay: 1,
        regional:'fr',
        dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
        dayNamesMin:  ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
        dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
        monthNames: ['Janvier','Fevrier','Mars','Avril','Mai','Juin','Juillet','Aout','Septembre','Octobre','Novembre','Décembre'],
        monthNamesShort: ['Jan','Fev','Mai','Avr','Mai','Juin','Juil','Aou','Sep','Oct','Nov','Dec'],
        dateFormat: 'dd-mm-yy',
        beforeShowDay: noWeekendsOrHolidays,
        minDate: 3,
        beforeShow : function() {
            var dateTime = new Date();
            var dayOfWeek = dateTime.getDay();
            if(dayOfWeek == 4 || dayOfWeek == 5) {
                $(this).datepicker( "option", "minDate", "5" );
            }
        }
    });
}

所以,我不知道如何处理这个案子:(今天+ 48小时)+周末+国庆日。我写了几个需要在DatePicker上重现的案例:

  • 如果当天 9月14日星期一,如果有国庆日( 2015-09-14或2015-09-15或2015-09-16或2015- 09-17 ),第二天可选择的将是2015-09-18周五。
    ((今天+ 48h)+ 1个国庆日= 4天禁用)
  • 如果当天 9月15日星期二,如果有国庆日( 2015-09-15或2015-09-16或2015-09-17或2015- 09-18 ),第二天可选择将于2015-09-21星期一。
    ((今天+ 48h)+ 1个国庆日+周末= 6天禁用)
  • 如果当天 9月16日星期三,如果有国庆日( 2015-09-16或2015-09-17或2015-09-18或2015- 09-21 ),第二天可选择的将是2015-09-22周二。
    ((今天+ 48h)+ 1个国庆日+周末= 6天禁用)
  • 如果当天 9月17日星期四,如果有国庆日( 2015-09-17或2015-09-18或2015-09-21或2015- 09-22 ),第二天可选择将于2015-09-23星期三。
    ((今天+ 48h)+ 1个国庆日+周末= 6天禁用)
  • 如果当天 9月18日星期五,如果有国庆日( 2015-09-18或2015-09-21或2015-09-22或2015- 09-23 ),第二天可选择将于2015-09-24周四。
    ((今天+ 48h)+ 1个国庆日+周末= 6天禁用)

如果周末有国庆日,我不算数。

该月的每一天都会执行noWeekendsOrHolidays功能,所以如果有国庆日,我需要每天检查。

JS FIDDLE

所以我的第一个问题是:这真的可以吗?我可以使用哪种算法来解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

  

所以,我不知道如何处理这个案子:(今天+ 48小时)+周末   +本周的国庆日。

     

所以我的第一个问题是:这真的可以吗?

  

我可以使用哪种算法来解决这个问题?

将您的问题分解成更小的部分。这是一个粗略的例子:

  1. 周末(S):
  2. 您不需要做任何额外的事情,因为jQuery UI Datepicker将为您完成。您只能使用所选日期调用noWeekends方法:

    jQuery.datepicker.noWeekends(selDate)
    
    1. 国庆日:
    2. 您可以拥有一个包含日期的数组,如下所示:

      var nationalDays = ['2015-09-17', '2015-09-21', '2015-09-28'];
      

      接下来,创建一个函数,该函数将检查该数组中是否存在特定日期。像这样:

      function chkNationalDays(selectedDate) {
          var retVal = [true, '', ''];
          nationalDays.forEach(function(dt) {
              var today = new Date(dt); 
              if (isEqual(selectedDate, today)) {
                  retVal = [false, '', '']; return;
              }
          });
          return retVal;
      };
      

      请记住,beforeShowDay需要三个值的数组(0)一个布尔值,指定是否需要禁用当前日期(1)用于样式化日期的css类,以及(2)要显示的文本在工具提示中。

      1. 今天和接下来的48小时,即今天和接下来的两天:
      2. 创建另一个函数来检查这个。类似的东西:

        function chkNext2Days(selectedDate) {
            var today = new Date(); 
            if (isEqual(selectedDate, today)) return [false, '', ''];
            today.setDate(today.getDate() + 1);
            if (isEqual(selectedDate, today)) return [false, '', ''];
            today.setDate(today.getDate() + 1);
            if (isEqual(selectedDate, today)) return [false, '', '']; 
            return [true, '', ''];
        }
        

        返回beforeShowDay期望的数组。

        1. 结合所有案例:
        2. 现在将所有案例组合在一起,检查返回数组的第一个元素是否返回false。非常简单但粗略地看起来像这样:

          function noWeekendsOrHolidays(selDate) {
              var noWeekend = jQuery.datepicker.noWeekends(selDate), 
                  noNationalDays = chkNationalDays(selDate),
                  noNext2Days = chkNext2Days(selDate),
                  retVal = true;
              if (noWeekend[0]) {
                  if (noNationalDays[0]) {
                      return noNext2Days;
                  } else {
                      return noNationalDays;
                  }
              } else  {
                  return noWeekend;
              }
          };
          
          1. 最后,在beforeShowDay
          2. 上设置回调

            这很简单:

            $("#dateInput").datepicker({
                beforeShowDay: noWeekendsOrHolidays, 
                ...
            });
            

            这是一个工作演示,包含所有代码:

            <强>段

            &#13;
            &#13;
            var nationalDays = ['2015-09-17', '2015-09-21', '2015-09-28'];
            
            $("#dt1").datepicker({
                dateFormat : 'yy-mm-dd',
                beforeShowDay: noWeekendsOrHolidays
            });
            
            function noWeekendsOrHolidays(selDate) {
                var noWeekend = jQuery.datepicker.noWeekends(selDate), 
                    noNationalDays = chkNationalDays(selDate),
                    noNext2Days = chkNext2Days(selDate),
                    retVal = true;
                if (noWeekend[0]) {
                    if (noNationalDays[0]) {
                        return noNext2Days;
                    } else {
                        return noNationalDays;
                    }
                } else  {
                    return noWeekend;
                }
            };
            
            function chkNext2Days(selectedDate) {
                var today = new Date(); 
                if (isEqual(selectedDate, today)) return [false, '', ''];
                today.setDate(today.getDate() + 1);
                if (isEqual(selectedDate, today)) return [false, '', ''];
                today.setDate(today.getDate() + 1);
                if (isEqual(selectedDate, today)) return [false, '', '']; 
                return [true, '', ''];
            }
            
            function chkNationalDays(selectedDate) {
                var retVal = [true, '', ''];
            	nationalDays.forEach(function(dt) {
            		var today = new Date(dt); 
                    if (isEqual(selectedDate, today)) {
                        retVal = [false, '', '']; return;
                    }
            	});
            	return retVal;
            };
            
            function isEqual(srcDate, tarDate) {
                if ((srcDate.getDate() == tarDate.getDate()) &&
                    (srcDate.getMonth() == tarDate.getMonth()) &&
                    (srcDate.getFullYear() == tarDate.getFullYear())) {
                    return true;
                } else { return false; }
            }
            &#13;
            <link href="https://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" rel="stylesheet"/>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
            <script src="https://code.jquery.com/ui/1.9.2/jquery-ui.min.js"></script>
            Date: <input id="dt1" />
            &#13;
            &#13;
            &#13;

            小提琴http://jsfiddle.net/abhitalks/ug5xx4t5/1/