日期选择器国定假日计数

Posted

技术标签:

【中文标题】日期选择器国定假日计数【英文标题】:datepicker national holidays count 【发布时间】:2012-09-13 18:06:50 【问题描述】:

我有 2 个输入,其中选择了日期 #startdate 和 #enddate。我正在使用 datepicker,目前已禁用周末和节假日,这很好用!

然后我有一个 #days 输入,它计算两个日期之间的差异,然后这个日期差异从中获取周末计数。

我想创建一个假期计数,这样我也可以从天数差中减去它。

所以我最终会得到

$('#days').val((Math.abs(($d2new-$d1new)/86400000) - weekend_count - holidaycount) + 1);

我当前的代码如下(这是从其他 *** 问题中提取的,并且运行良好:) 底部是我正在努力解决的 var holidaycount。任何帮助将不胜感激。

    //holidays
    var natDays = [
      [1, 1, 'uk'],
      [1, 2, 'uk'],
      [1, 3, 'uk'],
      [1, 4, 'uk'],
      [12, 24, 'uk'],
      [12, 25, 'uk'],
      [12, 26, 'uk'],
      [12, 27, 'uk'],
      [12, 28, 'uk'],
      [12, 29, 'uk'],
      [12, 30, 'uk'],
      [12, 31, 'uk']
    ];


    function noWeekendsOrHolidays(date) 
        var noWeekend = $.datepicker.noWeekends(date);
        if (noWeekend[0]) 
            return nationalDays(date);
         else 
            return noWeekend;
        
    
    function nationalDays(date) 
        for (i = 0; i < natDays.length; i++) 
            if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) 
                return [false, natDays[i][2] + '_day'];
            
        
        return [true, ''];
    



// do initialization here
$("#startdate").datepicker(
            dateFormat: 'dd-mm-yy',
            changeMonth: true,
            changeYear: true,
            firstDay: 1,
            yearRange: '0:+100',
            beforeShowDay: noWeekendsOrHolidays,
            onSelect: function( selectedDate ) 
                $("#enddate").datepicker("option","minDate",selectedDate );
                $("#enddate2").datepicker("option","minDate",selectedDate );
            ,              
            minDate: '+1d',         
            maxDate: '+' + DAY_DIFFERENCE + 'd'
);

// do initialization here
$("#enddate").datepicker(
            dateFormat: 'dd-mm-yy',
            changeMonth: true,
            changeYear: true,
            firstDay: 1,
            yearRange: '0:+100',
            beforeShowDay: noWeekendsOrHolidays,
            maxDate: '+' + DAY_DIFFERENCE + 'd'
);

// do initialization here
$("#enddate2").datepicker(
            dateFormat: 'dd-mm-yy',
            changeMonth: true,
            changeYear: true,
            firstDay: 1,
            yearRange: '0:+100',
            beforeShowDay: noWeekendsOrHolidays,
            onSelect: function( selectedDate ) 
                $d1 = $('#startdate').val();
                $d2 = $('#enddate2').val();

                $myDateParts1 = $d1.split("-");
                $myDateParts2 = $d2.split("-");

                $d1flip = new Date($myDateParts1[2], ($myDateParts1[1]-1), $myDateParts1[0]);
                $d2flip = new Date($myDateParts2[2], ($myDateParts2[1]-1), $myDateParts2[0]);

                $newdate1 = $d1flip.format("ddd mmm dd hh:MM:ss yyyy");
                $newdate2 = $d2flip.format("ddd mmm dd hh:MM:ss yyyy");

                // For Opera and older winXP IE n such              
                $d1new  = Date.parse($newdate1);
                $d2new  = Date.parse($newdate2);

                var weekend_count = 0;
                    for (i = $d1new.valueOf(); i <= $d2new.valueOf(); i+= 86400000)
                    var temp = new Date(i);
                        if (temp.getDay() == 0 || temp.getDay() == 6) 
                            weekend_count++;
                        
                

                var holidaycount = 0;
                    for (i = $d1new.valueOf(); i <= $d2new.valueOf(); i+= 86400000)
                    var temp = new Date(i);
                        if (**date in var natDays & is in selected difference range**) 
                            holidaycount++;
                        
                


            console.log(weekend_count);
            console.log(holidaycount);

                $('#days').val((Math.abs(($d2new-$d1new)/86400000) - weekend_count - holidaycount) + 1);
                       
);


, 'html');
return false;
);

编辑

从答案中,我已经插入了函数并尝试了这个.... console.log(holidaycount);返回 0,但我选择的日期应该是 10

            var holidaycount = 0;
                for (i = $d1new.valueOf(); i <= $d2new.valueOf(); i+= 86400000)
                var temp = new Date(i);
                    if (isHoliday(temp)) 
                        holidaycount++;
                                       
                

【问题讨论】:

@ManseUK 运行时会发生什么?好吧,if (**date in var natDays &amp; is in selected difference range**) 可能不是一个有效的 JS 条件(你知道,它在底部那里 是 var holidaycount,这是 [他] 正在努力解决的问题) .只是说;) 根据您的编辑,您调用 isHoliday 时只有一个参数(缺少参数 country),如果您复制/粘贴了我编写的函数,那么您将永远无法通过测试 country.toLowerCase() == natDays[i][2].toLowerCase()。如果还是不行,建议你提供一个jsFiddle之类的,我们可以测试一下。 【参考方案1】:

更新:根据 cmets 将 getMonth() 修改为 getMonth() + 1

**date in var natDays & is in selected difference range**

日期在选定的差异范围内始终为真,因为 new Date(i) 在所述范围内(就像在循环中 weekend_count 一样:您不必费心检查您是否在范围)。

现在,检查temp 中的日期是否是假期,您可能想要使用一个函数(尽管您仍然可以直接在代码中执行此操作):

/* dateObject is a JS Date object (e.g. dateObject = new Date();) */
/* country is the country we test holidays for */
function isHoliday(dateObject, country) 
  /* let's assume natDays is global, otherwise pass it as a third argument to this function */
  for(var i = 0; i < natDays.length; i++) 
    /* natDays[i][0] is a day, natDays[i][1] is a month, natDays[i][2] is a country indicator */
    if(parseInt(dateObject.getDate()) == parseInt(natDays[i][0]) && parseInt(dateObject.getMonth()) + 1 == parseInt(natDays[i][1]) && country.toLowerCase() == natDays[i][2].toLowerCase()) 
      /* found a day and a month matching our current Date's day and month: interrupt and tell caller dateObject is a holiday */
      return true;
    
  
  /* end of loop, we parsed all possible holidays without finding any match for our Date: tell caller the given Date is not a holiday */
  return false;

现在把它放到你的代码中:

if (isHoliday(temp, 'uk')) 
  holidaycount++;

这应该可以解决问题,尽管它可能需要一些重构(没有测试此代码),并且可能有更优雅的方法来做到这一点(例如修改 Date 对象的原型以将此函数用作对象的方法)。

【讨论】:

感谢您的回答,尽管我已经实现了这个 console.log(holidaycount);返回 0。我已经用你的代码中使用的内容更新了我的问题 知道了 :) 谢谢你------------ 仅供参考 if(parseInt(dateObject.getDate()) == parseInt(natDays[i][1] ) && parseInt(dateObject.getMonth() + 1) == parseInt(natDays[i][0])) ------------------这是月份,因为 0 = jan 等,月份和日期错误 很高兴知道,我更新了我的答案。如果没有更多内容,请您将此答案标记为好答案吗?享受假期;)

以上是关于日期选择器国定假日计数的主要内容,如果未能解决你的问题,请参考以下文章

如何获得所选国家的国定假日

Datepicker JQUERY 不选择输入日期

不能在另一个日期选择器中更改日期选择器参数?

引导日期选择器从另一个日期选择器更改 minDate/startDate

为啥这个引导日期选择器不显示日期选择器?

在日期选择器中选择日期后如何打开时间选择器