英文:
Calculate end date based on start day, no of session, Days Interval (Regular, alternate days)
问题
I want to calculate end date based on session start date, no of session, therapy days (Regular or Alternate days) and Sunday is off(no therapies on Sunday). In this code end date is not calculating properly. for references please see the images.
In this start date 01-08-2023, regular days, session are 6 and it is calculating end date as 06-08-2023 which is sunday
In this start date 01-08-2023, regular days, session are 10 and it is calculating end date as 12-08-2023 instead of 11 as there is only 1 sunday
This is my html code. results of this code is shown in above images
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="therapyday">Therapy Day <span class="login-danger">*</span></label>
<select id="therapyday" name="therapyday" class="form-control" required>
<option value="Regular">Regular</option>
<option value="Alternate Day">Alternate Day</option>
</select>
</div>
</div>
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="noSession">No. of Session <span class="login-danger">*</span></label>
<input id="noSession" name="noSession" class="form-control" type="text" required>
</div>
</div>
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="sessionstartdate">Session Start Date<span class="login-danger">*</span></label>
<input id="sessionstartdate" name="sessionstartdate" class="form-control" type="date" required>
</div>
</div>
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="sessionenddate">Session End Date<span class="login-danger">*</span></label>
<input id="sessionenddate" name="sessionenddate" class="form-control" type="date" required readonly>
</div>
</div>
This is JavaScript code:
const therapyDaySelect = document.getElementById("therapyday");
const noSessionInput = document.getElementById("noSession");
const sessionStartDateInput = document.getElementById("sessionstartdate");
const sessionEndDateInput = document.getElementById("sessionenddate");
// Add event listeners to calculate session end date
therapyDaySelect.addEventListener("change", calculateSessionEndDate);
noSessionInput.addEventListener("input", calculateSessionEndDate);
sessionStartDateInput.addEventListener("change", calculateSessionEndDate);
function calculateSessionEndDate() {
// Retrieve user input values
const therapyDay = therapyDaySelect.value;
const noSession = parseInt(noSessionInput.value);
const sessionStartDate = new Date(sessionStartDateInput.value);
// Calculate session end date
const sessionEndDate = calculateEndDate(
sessionStartDate,
noSession,
therapyDay
);
// Set session end date as the value of the input field
sessionEndDateInput.value = sessionEndDate.toISOString().split("T")[0];
}
function calculateEndDate(startDate, noOfSessions, therapyDay) {
const sessionDuration = therapyDay === "Regular" ? 1 : 2;
const endDate = new Date(startDate);
endDate.setDate(startDate.getDate() + noOfSessions * sessionDuration - 1);
const startDay = startDate.getDay();
const startDayOffset = startDay === 0 ? 1 : 7 - startDay;
const adjustedSessions = Math.floor((noOfSessions - 1) / 7) * 2;
const additionalDays =
therapyDay === "Regular"
? adjustedSessions
: Math.min(adjustedSessions, startDayOffset);
endDate.setDate(endDate.getDate() + additionalDays);
return endDate;
}
英文:
I want to calculate end date based on session start date, no of session, therapy days (Regular or Alternate days) and Sunday is off(no therapies on Sunday). In this code end date is not calculating properly. for references please see the images.
In this start date 01-08-2023, regular days, session are 6 and it is calculating end date as 06-08-2023 which is sunday
In this start date 01-08-2023, regular days, session are 10 and it is calculating end date as 12-08-2023 instead of 11 as there is only 1 sunday
This is my html code. results of this code is shown in above images
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="therapyday">Therapy Day <span class="login-danger">*</span></label>
<select id="therapyday" name="therapyday" class="form-control" required>
<option value="Regular">Regular</option>
<option value="Alternate Day">Alternate Day</option>
</select>
</div>
</div>
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="noSession">No. of Session <span class="login-danger">*</span></label>
<input id="noSession" name="noSession" class="form-control" type="text" required>
</div>
</div>
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="sessionstartdate">Session Start Date<span class="login-danger">*</span></label>
<input id="sessionstartdate" name="sessionstartdate" class="form-control" type="date" required>
</div>
</div>
<div class="col-12 col-md-6 col-xl-4">
<div class="form-group local-forms">
<label for="sessionenddate">Session End Date<span class="login-danger">*</span></label>
<input id="sessionenddate" name="sessionenddate" class="form-control" type="date" required readonly>
</div>
</div>`
this is javasript code
const therapyDaySelect = document.getElementById("therapyday");
const noSessionInput = document.getElementById("noSession");
const sessionStartDateInput = document.getElementById("sessionstartdate");
const sessionEndDateInput = document.getElementById("sessionenddate");
// Add event listeners to calculate session end date
therapyDaySelect.addEventListener("change", calculateSessionEndDate);
noSessionInput.addEventListener("input", calculateSessionEndDate);
sessionStartDateInput.addEventListener("change", calculateSessionEndDate);
function calculateSessionEndDate() {
// Retrieve user input values
const therapyDay = therapyDaySelect.value;
const noSession = parseInt(noSessionInput.value);
const sessionStartDate = new Date(sessionStartDateInput.value);
// Calculate session end date
const sessionEndDate = calculateEndDate(
sessionStartDate,
noSession,
therapyDay
);
// Set session end date as the value of the input field
sessionEndDateInput.value = sessionEndDate.toISOString().split("T")[0];
}
function calculateEndDate(startDate, noOfSessions, therapyDay) {
const sessionDuration = therapyDay === "Regular" ? 1 : 2;
const endDate = new Date(startDate);
endDate.setDate(startDate.getDate() + noOfSessions * sessionDuration - 1);
const startDay = startDate.getDay();
const startDayOffset = startDay === 0 ? 1 : 7 - startDay;
const adjustedSessions = Math.floor((noOfSessions - 1) / 7) * 2;
const additionalDays =
therapyDay === "Regular"
? adjustedSessions
: Math.min(adjustedSessions, startDayOffset);
endDate.setDate(endDate.getDate() + additionalDays);
return endDate;
}
答案1
得分: 0
我已调整了您的计算函数,以获取sessionEndDate。
我已进行了健全性检查,请在使用之前再次检查。
查看链接此处。
英文:
I've tweaked your calculation function, to get the sessionEndDate.
I've done sanity check, pls do double check before using it.
checkout the link here
答案2
得分: 0
这个函数对我有用,@jignesh,感谢你的帮助。
function calculateEndDate(startDate, noOfSessions, therapyDay) {
const sessionDates = [];
let currentDate = new Date(startDate);
for (let i = 0; i < noOfSessions; i++) {
if (therapyDay === 'Regular' || therapyDay === 'NonRegular') {
// Add session for regular or non-regular therapy days
sessionDates.push(new Date(currentDate));
}
// Increment the date for the next session
currentDate.setDate(currentDate.getDate() + 1);
}
// Calculate the end date by adding the last session's duration
const lastSessionDuration = therapyDay === 'Regular' ? 1 : 2;
const addNoofDays = (noOfSessions - 1) * lastSessionDuration;
let endDate = new Date(startDate);
endDate.setDate(endDate.getDate() + addNoofDays);
let sundayCnt = 0;
for (const sessionDate of sessionDates) {
if (sessionDate.getDay() === 0) {
sundayCnt++;
}
}
endDate.setDate(startDate.getDate() + addNoofDays + sundayCnt);
// check if end date falls on Sunday then add one more day
if (endDate.getDay() === 0) {
sundayCnt++;
}
endDate.setDate(startDate.getDate() + addNoofDays + sundayCnt);
return endDate;
}
// Example usage for non-regular session dates (1,3,5,7,9,11,14):
const sessionEndDate = calculateEndDate(new Date('2023-07-21'), 4, 'NonRegular');
console.log('sessionEndDate', sessionEndDate);
这是您提供的代码的翻译。
英文:
This function worked for me @jignesh thanks for your help.
function calculateEndDate(startDate, noOfSessions, therapyDay) {
const sessionDates = [];
let currentDate = new Date(startDate);
for (let i = 0; i < noOfSessions; i++) {
if (therapyDay === 'Regular' || therapyDay === 'NonRegular') {
// Add session for regular or non-regular therapy days
sessionDates.push(new Date(currentDate));
}
// Increment the date for the next session
currentDate.setDate(currentDate.getDate() + 1);
}
// Calculate the end date by adding the last session's duration
const lastSessionDuration = therapyDay === 'Regular' ? 1 : 2;
const addNoofDays = (noOfSessions - 1) * lastSessionDuration;
let endDate = new Date(startDate);
endDate.setDate(endDate.getDate() + addNoofDays);
let sundayCnt = 0;
for (const sessionDate of sessionDates) {
if (sessionDate.getDay() === 0) {
sundayCnt++;
}
}
endDate.setDate(startDate.getDate() + addNoofDays + sundayCnt);
// check if end date falls on Sunday then add one more day
if (endDate.getDay() === 0) {
sundayCnt++;
}
endDate.setDate(startDate.getDate() + addNoofDays + sundayCnt);
return endDate;
}
// Example usage for non-regular session dates (1,3,5,7,9,11,14):
const sessionEndDate = calculateEndDate(new Date('2023-07-21'), 4,
'NonRegular');
console.log('sessionEndDate', sessionEndDate);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论