首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DatePicker禁用国庆日+48小时+周末

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

Stack Overflow用户
提问于 2015-09-22 07:45:52
回答 1查看 1.7K关注 0票数 2

我知道,标题并不是很具体,但是我对DatePicker有一个问题。我试着在国庆日,周末和48小时后使之失效。现在我这么做了:

  • 今天躲藏+48小时,我使用minDate: 3
  • 躲藏周末
  • 隐藏国庆日,它们被保存在一个数组中。
  • 隐藏(今天+ 48h) +周末(禁用5天),beforeShow属性中的代码

我的代码现在看起来是这样的:

代码语言:javascript
运行
复制
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星期一。((今日+48小时)+1国庆日+周末=6天残疾)
  • 如果今天是9月16日星期三(),如果有一个国庆日(2015-09-16或2015-09-17或2015-09-18或2015-09-21),则可选择的第二天是2015年星期三-09-22。 ((今天+48小时)+1国庆日+周末=6天残疾)
  • 如果今天是9月17日星期四(),如果有一个国庆日(2015-09-17或2015-09-18或2015-09-21或2015-09-22),则可选择的第二天为2015-09-23星期三。 ((今天+48小时)+1国庆日+周末=6天残疾)
  • 如果今天是9月18日星期五(),如果有一个国庆日(2015-09-18或2015-09-21或2015-09-22或2015-09-23),则可选择的第二天为2015-09-24星期四。 ((今天+48小时)+1国庆日+周末=6天残疾)

我不知道周末是否有全国性的日子。

每个月的每一天都要执行函数noWeekendsOrHolidays,所以我需要每天检查是否有国庆节。

JS FIDDLE

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-09-22 09:39:31

所以,我不知道如何处理这个案子:(今天+48小时)+周末+国庆节。 所以我的第一个问题是:这真的是可能的吗?

是。

我能用哪种算法来解决这个问题?

把你的问题分解成更小的部分。下面是一个粗略的例子:

  1. 周末:

您不需要做任何额外的事情,因为jQuery UI数据报警器将为您做这件事。只使用选定日期调用noWeekends方法:

代码语言:javascript
运行
复制
jQuery.datepicker.noWeekends(selDate)
  1. 国庆日:

可以有一个包含天的数组,如下所示:

代码语言:javascript
运行
复制
var nationalDays = ['2015-09-17', '2015-09-21', '2015-09-28'];

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

代码语言:javascript
运行
复制
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小时,即今日及其后两天:

创建另一个函数来检查这一点。类似于:

代码语言:javascript
运行
复制
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. 合并所有案件:

现在,将所有的情况组合在一起,以检查是否有任何返回返回数组的第一个元素的false。很简单,但很粗糙,看起来是这样的:

代码语言:javascript
运行
复制
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上设置回调。

这很简单:

代码语言:javascript
运行
复制
$("#dateInput").datepicker({
    beforeShowDay: noWeekendsOrHolidays, 
    ...
});

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

片段

代码语言:javascript
运行
复制
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; }
}
代码语言:javascript
运行
复制
<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" />

Fiddlehttp://jsfiddle.net/abhitalks/ug5xx4t5/1/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32711213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档