【问题标题】:How to exclude weekend when adding days in Bootstrap Datepicker?在 Bootstrap Datepicker 中添加天数时如何排除周末?
【发布时间】:2017-01-17 02:41:43
【问题描述】:

我使用引导日期选择器。选择日期时,我想添加所选日期 +3 不包括周末(也可能是假期的一些随机日期)并将其放入文本框中。因此,如果选择的日期是 25 日星期五,那么文本框的值应该是 30 日星期三。这是我当前的脚本:

$('.date_get .date').datepicker({
    startView           : 0,
    todayBtn            : "linked",
    forceParse          : false,
    autoclose           : true,
    endDate             : "now",
    format              : "dd/mm/yyyy",
    todayHighlight      : true,
    daysOfWeekDisabled  : [0,6]
}).on('changeDate', function (selected) {

    //DATE 2 = DATE 1 + 3 Days
    var tgl = new Date(selected.date.valueOf() + (1000 * 60 * 60 * 24 * 3)); //Chosen date +3 days

    var hr  = tgl.getDate();
    var bln = tgl.getMonth() + 1; //Januari == 0

    if(bln <10)
    bln = "0"+bln;
    else
    bln = bln;

    var thn      = tgl.getFullYear();
    var hari_ini = hr + "/" + bln + "/" + thn;

    $('.date_tgt').val(hari_ini);
});

【问题讨论】:

    标签: javascript jquery twitter-bootstrap datepicker


    【解决方案1】:

    您可以使用moment.js 在javascript 中获取day of week。例如:

    var selectedDate = moment(new Date(selected.date.valueOf()); //create moment instance
    var dayOfWeek = selectedDate.day(); //will return 0-6, represent sunday-saturday
    

    然后您可以制定算法来调整您的需求,例如将星期几 (0-6) 映射到其附加值。像这样:

    var addedDays = [3, 3, 3, 5, 5, 5, 4]
    //example: 
    var selectedDate = moment("2017-01-13"); //friday last week
    var resultDate = selectedDate.add(addedDays[selectedDate.Day()], 'days');
    //resultDate = 13th (friday) + 5 days = 18th (wednesday)
    

    【讨论】:

    • 什么是加天?如果选择的日期是 14 日星期六,那么再加上 5 天就是 19 日星期四。应该还是 18 号星期三
    • 这是一周中要添加的数量。如果我们使用 moment.js 中的默认值,则 sunday = 0、monday = 1、tuesday = 2,依此类推。所以,我有数组addedDays,其索引与星期几相关,包含要添加的天数,以便它根据需要正确计算(+3 天不包括周末)。
    【解决方案2】:

    如果我理解正确,你可以试试这个。

      var date1 = new Date("Jan 20 2017 12:00:00 GMT+0800"); 
      var date2 = new Date(); 
      date2.setDate(date1.getDate()+5); //added 5 days
      var answer= dateDifference(date1,date2); 
    
      console.log(answer);
    
     function dateDifference(start, end) {
    
      // Copy date objects so don't modify originals
      var s = new Date(+start);
      var e = new Date(+end);
      var flag = new Date(+start);
      var numberOfWeekEnds = 0; 
    
      // Set time to midday to avoid dalight saving and browser quirks
      s.setHours(12,0,0,0);
      e.setHours(12,0,0,0);
    
      // Get the difference in whole days
      var totalDays = Math.round((e - s) / 8.64e7);
    
      // Get the difference in whole weeks
      var wholeWeeks = totalDays / 7 | 0;
    
      // Estimate business days as number of whole weeks * 5
      var days = wholeWeeks * 5;
    
      // If not even number of weeks, calc remaining weekend days
      var lasta
      if (totalDays % 7) {
        s.setDate(s.getDate() + wholeWeeks * 7);
    
        while (s < e) {
          s.setDate(s.getDate() + 1);
    
          // modified
          if (s.getDay() != 0 && s.getDay() != 6) {
            flag.setDate(flag.getDate() + 1 +numberOfWeekEnds);
            numberOfWeekEnds = 0
          }
          else{
            numberOfWeekEnds++;
          }
        }
      }
      return flag;
    }
    

    基本上我所做的是我修改了这个answer 的函数来检查一天是否是工作日。

    您可以在date1date2 附近玩耍以进一步检查。

    【讨论】:

      【解决方案3】:

      您需要使用setDate 函数添加三天。 试试这个

      var result = new Date(yourDate);
      result.setDate(result.getDate() + 3);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 2018-04-28
        • 2021-11-09
        相关资源
        最近更新 更多