Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在两个日期之间创建日期引用?_Javascript_Jquery_Date_Datepicker - Fatal编程技术网

Javascript 如何在两个日期之间创建日期引用?

Javascript 如何在两个日期之间创建日期引用?,javascript,jquery,date,datepicker,Javascript,Jquery,Date,Datepicker,开始日期和结束日期之间的15天间隔不包括所有星期五 准确的预期产出不包括所有周五 Start Date: 2019-03-03 End Date: 2020-03-02 在我的代码中,它不是2019年3月20日(我给出的开始日期)。请告诉我我在代码中哪里弄错了 功能代码 20-Mar-2019 //i need to start with the date 2019-03-03 dont start with the 20 March 2019 07-Apr-2019 24-Apr-201

开始日期和结束日期之间的15天间隔不包括所有星期五

准确的预期产出不包括所有周五

Start Date: 2019-03-03

End Date: 2020-03-02
在我的代码中,它不是2019年3月20日(我给出的开始日期)。请告诉我我在代码中哪里弄错了

功能代码

20-Mar-2019 //i need to start with the date 2019-03-03 dont start with the 20 March 2019
07-Apr-2019
24-Apr-2019
12-May-2019
29-May-2019
16-Jun-2019
03-Jul-2019
21-Jul-2019
07-Aug-2019
25-Aug-2019
11-Sep-2019
29-Sep-2019
16-Oct-2019
03-Nov-2019
20-Nov-2019
08-Dec-2019
25-Dec-2019
12-Jan-2020
29-Jan-2020
16-Feb-2020
函数n(d){
如果(d>3&&d<21)返回“th”;
开关(d%10){
案例1:返回“st”;
案例2:返回“nd”;
案例3:返回“rd”;
默认值:返回“th”;
}
}
函数dateToYMD(date){var strArray=['Jan',Feb',Mar',Apr',May',Jun',Jul',Aug',Sep',Oct',Nov',Dec'];var d=date.getDate();var m=strArray[date.getMonth()];var y=date.getFullYear();返回“”+(d这应该可以正常工作

function nth(d) {
  if (d > 3 && d < 21) return 'th'; 
  switch (d % 10) {
    case 1:  return "st";
    case 2:  return "nd";
    case 3:  return "rd";
    default: return "th";
  }
}

function dateToYMD(date) { var strArray=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var d = date.getDate(); var m = strArray[date.getMonth()]; var y = date.getFullYear(); return '' + (d <= 9 ? '0' + d : d) + '-' + m + '-' + y; }

Date.prototype.addDays = function(days) {
  var date = new Date(this.valueOf());
  date.setDate(date.getDate() + days);
  return date;
}

var cnt = 0;
function printNextPeriod(startDate, endDate, periodInDays) {
  var numWorkDays = 0;
  var currentDate = new Date(startDate);
  while (numWorkDays < periodInDays && currentDate <= endDate) {
   currentDate = currentDate.addDays(1);
    // Skips friday
    if (currentDate.getDay() !== 5) {
      numWorkDays++;
    }
    if (numWorkDays == periodInDays) {
      numWorkDays = 0;
      cnt++; 
      document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/>";
      document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/>";

    }
  }
}

var firtsjobstart = new Date("2019-03-03");
var end = new Date("2020-03-02");
var period = 157;
printNextPeriod(firtsjobstart, end, period);
函数打印下一个周期(开始日期、结束日期、周期天数){
var DaysRemain=0;
var currentDate=新日期(起始日期);

而(currentDate我发现您的代码中有几个问题

  • 在检查/打印日期之前,先增加日期
  • numWorkDays
    currentDate
    的变化不相同
  • 您还有
    numWorkDays
    ,这是错误的
  • 为了解决这个问题,我修改了您的
    printNextPeriod
    函数,顺便说一下,它应该命名为
    printNextPeriods

    function printNextPeriod(startDate, endDate, periodInDays) {
      var daysRemained = 0;
      var currentDate = new Date(startDate);
      while (currentDate <= endDate) {
        if (daysRemained === 0) {
          cnt++;
          daysRemained = periodInDays
          document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/>";
          document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/>";  
        }
        // Skips friday
        if (currentDate.getDay() !== 5) {
          daysRemained --;
        }
        currentDate = currentDate.addDays(1);
      }
    }
    
    
    函数打印下一个周期(开始日期、结束日期、周期天数){
    var numWorkDays=0;
    var currentDate=新日期(起始日期);
    
    而(currentDate要同时打印开始日期,您需要确保在第一次迭代时打印的条件为真,并确保开始日期不是星期五(否则添加1天)

    作为进一步的改进,我不会重复使用
    .addDays(1)
    ,而是通过计算一次就到达下一个日期。这可以通过确定间隔期内的完整周数来实现,并使用剩余天数来查看是否跨越周五

    以下是建议的代码:

    function printNextPeriod(startDate, endDate, periodInDays) {
        var numWorkDays = 0;
        var currentDate = new Date(startDate);
        while (currentDate <= endDate) { // only this condition is enough as you're modifying the currentDate
            // Skips friday
            if (currentDate.getDay() == 5) { // increase the currentDate and the numWorkDays if the currentDay is friday.. 
                currentDate = currentDate.addDays(1);
                numWorkDays++;
            }
            if (0 == numWorkDays % periodInDays) { //if its the same day or the periodInDays'th day..
                numWorkDays = 0;
                cnt++; 
                document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/>";
                document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/>";
    
            }
            numWorkDays ++;
            currentDate = currentDate.addDays(1);
    
    
        }
    }
    
    函数打印下一个周期(开始日期、结束日期、周期天数){
    var fullWeeks=Math.floor(periodInDays/6);//适合该周期的周数
    var numWorkDays=periodInDays-fullWeeks*6;//剩余天数
    var currentDate=新日期(起始日期);
    //确保不要在星期五开始
    如果(currentDate.getDay()==5)currentDate=currentDate.addDays(1);
    而(currentDate=daysUntilFriday));
    }
    }
    
    先生,没有问题对不起,是我的错,我编辑了正确的版本,请检查代码–只有答案没有那么大帮助。好的答案应该解释OP为什么会有问题,以及你的代码是如何解决的。这在少数情况下不起作用,例如,如果开始日期是星期五,而到
    天的突变是不同的om currentDate@RobG,听起来很合理,但在这种情况下,代码非常简单,我想它本身就说明了问题……至少我不希望有人开始向我解释3行代码,我会觉得很丢脸……总之,我明白你的意思了,谢谢分享。我不明白你在说什么?如果合同开始时间是2019-09年-01,结束日期为2020-08-31。因此,每个月两次,我们需要做两次服务或工作。当我给出期限var period=13时,这些年的b/w服务将出现25次。这将是错误的权利???在一年的合同中,只有24次服务应该是正确的???我每月需要做两次服务。因此,一年12个月,24次服务将是正确的?此对话无效。我只想重复一次,您必须编辑您的问题并解释规则是什么。在任何地方,您都没有解释存在参数“一个月三次”的地方。问题只涉及所选日期之间的天数。我现在继续。如果您不在问题中努力解释在一般情况下这些条件是什么(当三次?当两次?),那么不要期望我方做出任何努力。请注意,在您的示例中(在问题中)有时每个月有一个日期,有时两个。您的问题不一致。您已对大多数答案发表了评论,并添加了其他要求。请单击问题下方的编辑链接,确保所有要求都在问题中。
    
    function printNextPeriod(startDate, endDate, periodInDays) {
        var fullWeeks = Math.floor(periodInDays / 6); // number of weeks that fit in period
        var numWorkDays = periodInDays - fullWeeks * 6; // remaining number of days
        var currentDate = new Date(startDate);
        // Make sure not to start on a Friday
        if (currentDate.getDay() === 5) currentDate = currentDate.addDays(1);
    
        while (currentDate <= endDate) {
            cnt++; 
            document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/" + ">";
            document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/" + ">";
    
            var daysUntilFriday = (12 - currentDate.getDay()) % 7;
            // Add the full weeks (7 days, always bringing you to the same day-of-the-week)
            // Add the remaining number of days
            // Add one extra day if we cross a Friday in that remaining number of days
            currentDate = currentDate.addDays(fullWeeks * 7 + numWorkDays 
                                              + (numWorkDays >= daysUntilFriday));
        }
    }