Javascript 如何在两个日期之间创建日期引用?
开始日期和结束日期之间的15天间隔不包括所有星期五 准确的预期产出不包括所有周五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
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));
}
}