0

日付が#startdateと#enddateで選択されている2つの入力があります。私はdatepickerを使用していて、現在週末と休日を無効にしています。これはうまく機能しています。

次に、2つの日付の差を計算する#days入力があり、この日付の差から週末のカウントが取得されます。

日数の違いからこれを差し引くことができるように、休日カウントを作成したいと思います。

だから私は

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

私の現在のコードは次のとおりです(これは他のstackoverflowの質問から取得され、うまく機能しています:)下部に向かって、私が苦労しているvarholidaycountです。どんな助けでも大歓迎です。

    //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++;
                }                       
                }
4

1 に答える 1

1

更新:コメントに応じてgetMonth()変更されました。getMonth() + 1

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

日付が選択された差の範囲内new Date(i)にある場合は、上記の範囲内と同様に常にtrueです(ループの場合と同様に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オブジェクトのプロトタイプを改造してこの関数をオブジェクトのメソッドとして使用するなど)。

于 2012-09-21T11:59:31.257 に答える