在 javascript 日期计算中排除周末
exclude weekends in javascript date calculation
我有两组有效的代码。需要帮助将它们合二为一。
这段代码让我知道了两个日期之间的差异。完美运行:
function test(){
var date1 = new Date(txtbox_1.value);
var date2 = new Date(txtbox_2.value);
var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
txtbox_3.value = days + "." + hrs; }
source for the above code
@cyberfly 下面的代码似乎有排除 sat 和 sun 的答案,这正是我需要的。 source。但是,它在 jquery 中并且上面的代码是在 JS 中。因此,需要帮助结合,因为我缺乏这方面的知识:(
<script type="text/javascript">
$("#startdate, #enddate").change(function() {
var d1 = $("#startdate").val();
var d2 = $("#enddate").val();
var minutes = 1000*60;
var hours = minutes*60;
var day = hours*24;
var startdate1 = getDateFromFormat(d1, "d-m-y");
var enddate1 = getDateFromFormat(d2, "d-m-y");
var days = calcBusinessDays(new Date(startdate1),new Date(enddate1));
if(days>0)
{ $("#noofdays").val(days);}
else
{ $("#noofdays").val(0);}
});
</script>
编辑
尝试组合代码。这是我的样本。获取 对象预期错误。
function test(){
var date1 = new Date(startdate.value);
var date2 = new Date(enddate.value);
var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
var startdate1 = getDateFromFormat(startdate, "dd/mm/yyyy hh:mm");
var enddate1 = getDateFromFormat(enddate, "dd/mm/yyyy hh:mm");
days = calcBusinessDays(new Date(startdate1),new Date(enddate1));
noofdays.value = days + "." + hrs; }
start: <input type="text" id="startdate" name="startdate" value="02/03/2015 00:00">
end: <input type="text" id="enddate" name="enddate" value="02/03/2015 00:01">
<input type="text" id="noofdays" name="noofdays" value="">
下面是一个简单的函数,用于计算两个日期对象之间的工作日天数。按照设计,它不计算开始日期,但计算结束日期,因此如果您在一周的星期二和下一周的星期二给它一个日期,它将 return 5 个工作日。这不考虑节假日,但在夏令时变化时可以正常工作。
function calcBusinessDays(start, end) {
// This makes no effort to account for holidays
// Counts end day, does not count start day
// make copies we can normalize without changing passed in objects
var start = new Date(start);
var end = new Date(end);
// initial total
var totalBusinessDays = 0;
// normalize both start and end to beginning of the day
start.setHours(0,0,0,0);
end.setHours(0,0,0,0);
var current = new Date(start);
current.setDate(current.getDate() + 1);
var day;
// loop through each day, checking
while (current <= end) {
day = current.getDay();
if (day >= 1 && day <= 5) {
++totalBusinessDays;
}
current.setDate(current.getDate() + 1);
}
return totalBusinessDays;
}
并且,jQuery + jQueryUI 演示代码:
// make both input fields into date pickers
$("#startDate, #endDate").datepicker();
// process click to calculate the difference between the two days
$("#calc").click(function(e) {
var diff = calcBusinessDays(
$("#startDate").datepicker("getDate"),
$("#endDate").datepicker("getDate")
);
$("#diff").html(diff);
});
而且,这是一个使用 jQueryUI 中的日期选择器构建的简单演示:http://jsfiddle.net/jfriend00/z1txs10d/
确定两个日期之间的天数时,需要做出很多关于什么是一天的决定。例如,2 月 1 日至 2 月 2 日期间通常为 1 天,因此 2 月 1 日至 2 月 1 日为零天。
再加上只计算工作日的复杂性,事情就会变得更加困难。例如。 Monday 2 Feb 2015 to Friday 6 February is 4 elapsed days (Monday to Tuesday is 1, Monday to Wednesday is 2, etc.), 然而表达“周一至周五”通常被视为5个工作日和持续时间Mon 2 Feb到 2 月 7 日星期六也应该是 4 个工作日,但星期日到星期六应该是 5 个工作日。
这是我的算法:
- 获取两个日期之间的总天数
- 除以 7 得到整周数
- 将周数乘以二得到周末天数
- 从整体中减去周末天数得到工作日
- 如果总天数不是偶数周,则将周数 * 7 添加到开始日期以获得临时日期
- 虽然临时日期小于结束日期:
- 如果临时日期不是周六或周日,则加一个工作日
- 临时日期加一
- 就是这样。
末尾的步进部分可能可以用其他算法代替,但它不会循环超过 6 天,因此这是解决周数不均问题的简单且相当有效的解决方案。
上述的一些后果:
- 周一至周五为 4 个工作日
- 不同周中的任何一天到同一天都是偶数周,因此是 5 的偶数倍,例如2 月 2 日星期一至 2 月 9 日星期一和 2 月 1 日星期日至 2 月 8 日星期日为 5 个工作日
- 2 月 6 日星期五至 2 月 7 日星期日为零工作日
- 2 月 6 日星期五到 2 月 9 日星期一是一个工作日
- 2 月 8 日星期日至:2 月 15 日星期日、2 月 14 日星期六和 2 月 13 日星期五均为 5 个工作日
代码如下:
// Expects start date to be before end date
// start and end are Date objects
function dateDifference(start, end) {
// Copy date objects so don't modify originals
var s = new Date(+start);
var e = new Date(+end);
// 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
if (totalDays % 7) {
s.setDate(s.getDate() + wholeWeeks * 7);
while (s < e) {
s.setDate(s.getDate() + 1);
// If day isn't a Sunday or Saturday, add to business days
if (s.getDay() != 0 && s.getDay() != 6) {
++days;
}
}
}
return days;
}
我不知道它与 jfriend00 的答案或您引用的代码相比如何,如果您希望包含期间,如果开始或结束日期是工作日,只需添加一个。
@RobG 给出了一个很好的算法来区分工作日和周末。
我认为唯一的问题是如果开始的日子是周末,周六或周日,那么工作的次数days/weekends会少一个。
更正后的代码如下。
function dateDifference(start, end) {
// Copy date objects so don't modify originals
var s = new Date(start);
var e = new Date(end);
var addOneMoreDay = 0;
if( s.getDay() == 0 || s.getDay() == 6 ) {
addOneMoreDay = 1;
}
// 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
if (totalDays % 7) {
s.setDate(s.getDate() + wholeWeeks * 7);
while (s < e) {
s.setDate(s.getDate() + 1);
// If day isn't a Sunday or Saturday, add to business days
if (s.getDay() != 0 && s.getDay() != 6) {
++days;
}
//s.setDate(s.getDate() + 1);
}
}
var weekEndDays = totalDays - days + addOneMoreDay;
return weekEndDays;
}
JSFiddle link 是 https://jsfiddle.net/ykxj4k09/2/
首先获取一个月的天数
totalDays(month, year) {
return new Date(year, month, 0).getDate();
}
然后通过删除星期六和星期日获得一个月中没有工作日
totalWorkdays() {
var d = new Date(); // to know present date
var m = d.getMonth() + 1; // to know present month
var y = d.getFullYear(); // to knoow present year
var td = this.totalDays(m, y);// to get no of days in a month
for (var i = 1; i <= td; i++) {
var s = new Date(y, m - 1, i);
if (s.getDay() != 0 && s.getDay() != 6) {
this.workDays.push(s.getDate());// working days
}else {
this.totalWeekDays.push(s.getDate());//week days
}
}
this.totalWorkingDays = this.workDays.length;
}
const firstDate = new Date("December 30, 2020");
const secondDate = new Date("January 4, 2021");
const daysWithOutWeekEnd = [];
for (var currentDate = new Date(firstDate); currentDate <= secondDate; currentDate.setDate(currentDate.getDate() + 1)) {
// console.log(currentDate);
if (currentDate.getDay() != 0 && currentDate.getDay() != 6) {
daysWithOutWeekEnd.push(new Date(currentDate));
}
}
console.log(daysWithOutWeekEnd, daysWithOutWeekEnd.length);
我认为上面其他人分享的代码片段很长。
我正在分享一个简洁的片段,在考虑指定的总天数后给出日期。我们还可以自定义周六和周日以外的日期。
function getBusinessDays(dateObj, days) {
for (var i = 0; i < days; i++) {
if (days > 0) {
switch (dateObj.getDay()) {
// 6 being Saturday and 0 being Sunday.
case 6, 0:
dateObj.setDate(dateObj.getDate() + 2)
break;
//5 = Friday.
case 5:
dateObj.setDate(dateObj.getDate() + 3)
break;
//handle Monday, Tuesday, Wednesday and Thursday!
default:
dateObj.setDate(dateObj.getDate() + 1)
//console.log(dateObj)
break;
}
}
}
return dateObj;
}
console.log(getBusinessDays(new Date(), 11))
//Mon Dec 20 2021 18:56:01 GMT+0530 (India Standard Time)
我有两组有效的代码。需要帮助将它们合二为一。
这段代码让我知道了两个日期之间的差异。完美运行:
function test(){
var date1 = new Date(txtbox_1.value);
var date2 = new Date(txtbox_2.value);
var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
txtbox_3.value = days + "." + hrs; }
source for the above code
@cyberfly 下面的代码似乎有排除 sat 和 sun 的答案,这正是我需要的。 source。但是,它在 jquery 中并且上面的代码是在 JS 中。因此,需要帮助结合,因为我缺乏这方面的知识:(
<script type="text/javascript">
$("#startdate, #enddate").change(function() {
var d1 = $("#startdate").val();
var d2 = $("#enddate").val();
var minutes = 1000*60;
var hours = minutes*60;
var day = hours*24;
var startdate1 = getDateFromFormat(d1, "d-m-y");
var enddate1 = getDateFromFormat(d2, "d-m-y");
var days = calcBusinessDays(new Date(startdate1),new Date(enddate1));
if(days>0)
{ $("#noofdays").val(days);}
else
{ $("#noofdays").val(0);}
});
</script>
编辑 尝试组合代码。这是我的样本。获取 对象预期错误。
function test(){
var date1 = new Date(startdate.value);
var date2 = new Date(enddate.value);
var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
var startdate1 = getDateFromFormat(startdate, "dd/mm/yyyy hh:mm");
var enddate1 = getDateFromFormat(enddate, "dd/mm/yyyy hh:mm");
days = calcBusinessDays(new Date(startdate1),new Date(enddate1));
noofdays.value = days + "." + hrs; }
start: <input type="text" id="startdate" name="startdate" value="02/03/2015 00:00">
end: <input type="text" id="enddate" name="enddate" value="02/03/2015 00:01">
<input type="text" id="noofdays" name="noofdays" value="">
下面是一个简单的函数,用于计算两个日期对象之间的工作日天数。按照设计,它不计算开始日期,但计算结束日期,因此如果您在一周的星期二和下一周的星期二给它一个日期,它将 return 5 个工作日。这不考虑节假日,但在夏令时变化时可以正常工作。
function calcBusinessDays(start, end) {
// This makes no effort to account for holidays
// Counts end day, does not count start day
// make copies we can normalize without changing passed in objects
var start = new Date(start);
var end = new Date(end);
// initial total
var totalBusinessDays = 0;
// normalize both start and end to beginning of the day
start.setHours(0,0,0,0);
end.setHours(0,0,0,0);
var current = new Date(start);
current.setDate(current.getDate() + 1);
var day;
// loop through each day, checking
while (current <= end) {
day = current.getDay();
if (day >= 1 && day <= 5) {
++totalBusinessDays;
}
current.setDate(current.getDate() + 1);
}
return totalBusinessDays;
}
并且,jQuery + jQueryUI 演示代码:
// make both input fields into date pickers
$("#startDate, #endDate").datepicker();
// process click to calculate the difference between the two days
$("#calc").click(function(e) {
var diff = calcBusinessDays(
$("#startDate").datepicker("getDate"),
$("#endDate").datepicker("getDate")
);
$("#diff").html(diff);
});
而且,这是一个使用 jQueryUI 中的日期选择器构建的简单演示:http://jsfiddle.net/jfriend00/z1txs10d/
确定两个日期之间的天数时,需要做出很多关于什么是一天的决定。例如,2 月 1 日至 2 月 2 日期间通常为 1 天,因此 2 月 1 日至 2 月 1 日为零天。
再加上只计算工作日的复杂性,事情就会变得更加困难。例如。 Monday 2 Feb 2015 to Friday 6 February is 4 elapsed days (Monday to Tuesday is 1, Monday to Wednesday is 2, etc.), 然而表达“周一至周五”通常被视为5个工作日和持续时间Mon 2 Feb到 2 月 7 日星期六也应该是 4 个工作日,但星期日到星期六应该是 5 个工作日。
这是我的算法:
- 获取两个日期之间的总天数
- 除以 7 得到整周数
- 将周数乘以二得到周末天数
- 从整体中减去周末天数得到工作日
- 如果总天数不是偶数周,则将周数 * 7 添加到开始日期以获得临时日期
- 虽然临时日期小于结束日期:
- 如果临时日期不是周六或周日,则加一个工作日
- 临时日期加一
- 就是这样。
末尾的步进部分可能可以用其他算法代替,但它不会循环超过 6 天,因此这是解决周数不均问题的简单且相当有效的解决方案。
上述的一些后果:
- 周一至周五为 4 个工作日
- 不同周中的任何一天到同一天都是偶数周,因此是 5 的偶数倍,例如2 月 2 日星期一至 2 月 9 日星期一和 2 月 1 日星期日至 2 月 8 日星期日为 5 个工作日
- 2 月 6 日星期五至 2 月 7 日星期日为零工作日
- 2 月 6 日星期五到 2 月 9 日星期一是一个工作日
- 2 月 8 日星期日至:2 月 15 日星期日、2 月 14 日星期六和 2 月 13 日星期五均为 5 个工作日
代码如下:
// Expects start date to be before end date
// start and end are Date objects
function dateDifference(start, end) {
// Copy date objects so don't modify originals
var s = new Date(+start);
var e = new Date(+end);
// 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
if (totalDays % 7) {
s.setDate(s.getDate() + wholeWeeks * 7);
while (s < e) {
s.setDate(s.getDate() + 1);
// If day isn't a Sunday or Saturday, add to business days
if (s.getDay() != 0 && s.getDay() != 6) {
++days;
}
}
}
return days;
}
我不知道它与 jfriend00 的答案或您引用的代码相比如何,如果您希望包含期间,如果开始或结束日期是工作日,只需添加一个。
@RobG 给出了一个很好的算法来区分工作日和周末。 我认为唯一的问题是如果开始的日子是周末,周六或周日,那么工作的次数days/weekends会少一个。
更正后的代码如下。
function dateDifference(start, end) {
// Copy date objects so don't modify originals
var s = new Date(start);
var e = new Date(end);
var addOneMoreDay = 0;
if( s.getDay() == 0 || s.getDay() == 6 ) {
addOneMoreDay = 1;
}
// 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
if (totalDays % 7) {
s.setDate(s.getDate() + wholeWeeks * 7);
while (s < e) {
s.setDate(s.getDate() + 1);
// If day isn't a Sunday or Saturday, add to business days
if (s.getDay() != 0 && s.getDay() != 6) {
++days;
}
//s.setDate(s.getDate() + 1);
}
}
var weekEndDays = totalDays - days + addOneMoreDay;
return weekEndDays;
}
JSFiddle link 是 https://jsfiddle.net/ykxj4k09/2/
首先获取一个月的天数
totalDays(month, year) {
return new Date(year, month, 0).getDate();
}
然后通过删除星期六和星期日获得一个月中没有工作日
totalWorkdays() {
var d = new Date(); // to know present date
var m = d.getMonth() + 1; // to know present month
var y = d.getFullYear(); // to knoow present year
var td = this.totalDays(m, y);// to get no of days in a month
for (var i = 1; i <= td; i++) {
var s = new Date(y, m - 1, i);
if (s.getDay() != 0 && s.getDay() != 6) {
this.workDays.push(s.getDate());// working days
}else {
this.totalWeekDays.push(s.getDate());//week days
}
}
this.totalWorkingDays = this.workDays.length;
}
const firstDate = new Date("December 30, 2020");
const secondDate = new Date("January 4, 2021");
const daysWithOutWeekEnd = [];
for (var currentDate = new Date(firstDate); currentDate <= secondDate; currentDate.setDate(currentDate.getDate() + 1)) {
// console.log(currentDate);
if (currentDate.getDay() != 0 && currentDate.getDay() != 6) {
daysWithOutWeekEnd.push(new Date(currentDate));
}
}
console.log(daysWithOutWeekEnd, daysWithOutWeekEnd.length);
我认为上面其他人分享的代码片段很长。 我正在分享一个简洁的片段,在考虑指定的总天数后给出日期。我们还可以自定义周六和周日以外的日期。
function getBusinessDays(dateObj, days) {
for (var i = 0; i < days; i++) {
if (days > 0) {
switch (dateObj.getDay()) {
// 6 being Saturday and 0 being Sunday.
case 6, 0:
dateObj.setDate(dateObj.getDate() + 2)
break;
//5 = Friday.
case 5:
dateObj.setDate(dateObj.getDate() + 3)
break;
//handle Monday, Tuesday, Wednesday and Thursday!
default:
dateObj.setDate(dateObj.getDate() + 1)
//console.log(dateObj)
break;
}
}
}
return dateObj;
}
console.log(getBusinessDays(new Date(), 11))
//Mon Dec 20 2021 18:56:01 GMT+0530 (India Standard Time)