怎么计算一段时间内工作日天数?

时间:2021-10-22 22:37:15
怎么计算一段时间内工作日天数?即输入2个参数,2006-7-12 ,2006-8-23,求这段时间内不算周六和周日的天数。

7 个解决方案

#1


说一说我的思路:
先算总数,然后算经历的周数(注意第一天是否为周日以及最后一天是否为周六),
最后根据周数算出周末总天数,然后从总天数里减去周末总天数  OVER

#2


给段代码看看吧

#3


用这个方法试一试 getDiffDaysNoWeekend(Date start, Date end)

public class DateUtils {
public static int getDiffDays(Date start, Date end) {
int rtn = Integer.MIN_VALUE;
if (start != null && end != null) {
long lngMinMilSec = start.getTime();
long lngMaxMilSec = end.getTime();
rtn = (int) ((lngMaxMilSec - lngMinMilSec) / (1000 * 60 * 60 * 24));
}
return rtn;
}

public static int getDiffDaysWithWeekend(Date start, Date end) {
int rtn = getDiffDays(start, end);
return rtn != Integer.MIN_VALUE ? rtn + 1 : Integer.MIN_VALUE;
}

public static int getWeek(Date dt) {
int rtn = Integer.MIN_VALUE;
Calendar cd = Calendar.getInstance();
cd.setTime(dt);
int week = cd.get(Calendar.DAY_OF_WEEK);
if (week == 1) {
rtn = 7;
} else {
rtn = week - 1;
}
return rtn;
}

public static int getDiffDaysNoWeekend(Date start, Date end) {
int rtn = Integer.MIN_VALUE;

// Monday 1 -- Sunday 7
int weekStart = getWeek(start);
int weekEnd = getWeek(end);
int days = getDiffDaysWithWeekend(start, end);

if (days > 1) {
if (weekStart == weekEnd) {
rtn = days - ((days % 7) * 2);
} else {
int intg = days / 7;
int mod = days % 7;

switch (weekStart) {
case 1:
case 2:
case 3:
case 4:
case 5:
if (mod > (6 - weekStart)) {
mod = 6 - weekStart - mod;
if (mod < -2)
mod = -2;
} else {
mod = 0;
}
rtn = days - intg * 2 + mod;
break;
case 6:
rtn = days - intg * 2 - 2;
break;
case 7:
mod = 7 - (mod - 0);
rtn = days - intg * 2 - 1;
break;
}
}
} else if(days==1){
if (weekStart == 6 || weekStart == 7) {
rtn = 0;
} else {
rtn = 1;
}
}
return rtn;
}
}

#4


修正一下 getDiffDaysNoWeekend(Date start, Date end)

public static int getDiffDaysNoWeekend(Date start, Date end) {
int rtn = Integer.MIN_VALUE;

// Total days
int days = getDiffDaysWithWeekend(start, end);

// Monday 1 -- Sunday 7
int weekStart = getWeek(start);

// Week count
int intg = days / 7;

// left days
int mod1 = days % 7;

// left days modified
int mod2 = (weekStart+mod1)%7;

int factor = 0;
if(mod1!=0 && mod2<weekStart){

// Start date is from Monday 1 -- Saturday 6.
if(weekStart!=7){
factor = mod2+1;
// Max value is 2
if(factor>2) factor = 2;
}else {
factor = 1;
}
}
rtn = days - intg*2-factor;
return rtn;
}

#5


算一个日期有必要用这么长的代码吗?

#6


只要知道总天数(T),开始日是周几(X),就可以得到结果了。
      计算公式: 工作天数 = 总天数 - 周数*2 - 修正因子。

前提:开始日是周几 : 1,2,。。。7,分别代表 周一 到 周日
(1)。 用 总天数(T)整除 7 得到 周数(W): W = T 整除 7
(2)。 用 总天数(T)取余 7 得到 余下天数(MOD1): MOD1 = T 取余 7  
       注: MOD1 , 0, 1,2,...6
(3)。 用开始日是周几(X) 加上 余下天数(MOD1) 取余 7 得到 修正余数(MOD2): MOD2 = (X+ MOD1) 取余 7
       注: MOD2 , 0, 1,2,...6
(4)。 当 MOD1 〉0 and  MOD2<开始日是周几(X) 时,修要计算“修正因子(F)“. 否则 不用修正。修正因子(F)最大值为2
周几     1 2 3 4 5 6 7 1 2 3 4 5 6 7
开始日1  1
MOD1     1 2 3 4 5 6     (需要修正 6)
开始日2    2
MOD1       1 2 3 4 5 6    (需要修正 5,6)
开始日3      3
MOD1         1 2 3 4 5 6   (需要修正 4,5,6)
开始日4        4
MOD1           1 2 3 4 5 6  (需要修正 3,4,5,6)
开始日5          5
MOD1             1 2 3 4 5 6 (需要修正 2,3,4,5,6)
开始日6            6
MOD1               1 2 3 4 5 6 (需要修正 1,2,3,4,5,6)
开始日7              7
MOD1                 1 2 3 4 5 6  (需要修正 1,2,3,4,5,6)

开始日(1-6) 修正因子(F) = MOD2 +1 ,但最大值为 2,
开始日(7) 修正因子(F) = 1 

#7


//可以在循环中把日期转成Calendar格式,然后读取该天的星期:
String xingqi = calendar.toString().substring(calendar.toString().indexOf(
          "DAY_OF_WEEK=") + 12, calendar.toString().indexOf("DAY_OF_WEEK=") + 13);
int xq = Integer.parseInt(xingqi);
//然后判断
if (xq == 1 || xq == 7){//条件还可以增加月日满足条件的假日如(month==10&&day==1)等等
  //处理
}

#1


说一说我的思路:
先算总数,然后算经历的周数(注意第一天是否为周日以及最后一天是否为周六),
最后根据周数算出周末总天数,然后从总天数里减去周末总天数  OVER

#2


给段代码看看吧

#3


用这个方法试一试 getDiffDaysNoWeekend(Date start, Date end)

public class DateUtils {
public static int getDiffDays(Date start, Date end) {
int rtn = Integer.MIN_VALUE;
if (start != null && end != null) {
long lngMinMilSec = start.getTime();
long lngMaxMilSec = end.getTime();
rtn = (int) ((lngMaxMilSec - lngMinMilSec) / (1000 * 60 * 60 * 24));
}
return rtn;
}

public static int getDiffDaysWithWeekend(Date start, Date end) {
int rtn = getDiffDays(start, end);
return rtn != Integer.MIN_VALUE ? rtn + 1 : Integer.MIN_VALUE;
}

public static int getWeek(Date dt) {
int rtn = Integer.MIN_VALUE;
Calendar cd = Calendar.getInstance();
cd.setTime(dt);
int week = cd.get(Calendar.DAY_OF_WEEK);
if (week == 1) {
rtn = 7;
} else {
rtn = week - 1;
}
return rtn;
}

public static int getDiffDaysNoWeekend(Date start, Date end) {
int rtn = Integer.MIN_VALUE;

// Monday 1 -- Sunday 7
int weekStart = getWeek(start);
int weekEnd = getWeek(end);
int days = getDiffDaysWithWeekend(start, end);

if (days > 1) {
if (weekStart == weekEnd) {
rtn = days - ((days % 7) * 2);
} else {
int intg = days / 7;
int mod = days % 7;

switch (weekStart) {
case 1:
case 2:
case 3:
case 4:
case 5:
if (mod > (6 - weekStart)) {
mod = 6 - weekStart - mod;
if (mod < -2)
mod = -2;
} else {
mod = 0;
}
rtn = days - intg * 2 + mod;
break;
case 6:
rtn = days - intg * 2 - 2;
break;
case 7:
mod = 7 - (mod - 0);
rtn = days - intg * 2 - 1;
break;
}
}
} else if(days==1){
if (weekStart == 6 || weekStart == 7) {
rtn = 0;
} else {
rtn = 1;
}
}
return rtn;
}
}

#4


修正一下 getDiffDaysNoWeekend(Date start, Date end)

public static int getDiffDaysNoWeekend(Date start, Date end) {
int rtn = Integer.MIN_VALUE;

// Total days
int days = getDiffDaysWithWeekend(start, end);

// Monday 1 -- Sunday 7
int weekStart = getWeek(start);

// Week count
int intg = days / 7;

// left days
int mod1 = days % 7;

// left days modified
int mod2 = (weekStart+mod1)%7;

int factor = 0;
if(mod1!=0 && mod2<weekStart){

// Start date is from Monday 1 -- Saturday 6.
if(weekStart!=7){
factor = mod2+1;
// Max value is 2
if(factor>2) factor = 2;
}else {
factor = 1;
}
}
rtn = days - intg*2-factor;
return rtn;
}

#5


算一个日期有必要用这么长的代码吗?

#6


只要知道总天数(T),开始日是周几(X),就可以得到结果了。
      计算公式: 工作天数 = 总天数 - 周数*2 - 修正因子。

前提:开始日是周几 : 1,2,。。。7,分别代表 周一 到 周日
(1)。 用 总天数(T)整除 7 得到 周数(W): W = T 整除 7
(2)。 用 总天数(T)取余 7 得到 余下天数(MOD1): MOD1 = T 取余 7  
       注: MOD1 , 0, 1,2,...6
(3)。 用开始日是周几(X) 加上 余下天数(MOD1) 取余 7 得到 修正余数(MOD2): MOD2 = (X+ MOD1) 取余 7
       注: MOD2 , 0, 1,2,...6
(4)。 当 MOD1 〉0 and  MOD2<开始日是周几(X) 时,修要计算“修正因子(F)“. 否则 不用修正。修正因子(F)最大值为2
周几     1 2 3 4 5 6 7 1 2 3 4 5 6 7
开始日1  1
MOD1     1 2 3 4 5 6     (需要修正 6)
开始日2    2
MOD1       1 2 3 4 5 6    (需要修正 5,6)
开始日3      3
MOD1         1 2 3 4 5 6   (需要修正 4,5,6)
开始日4        4
MOD1           1 2 3 4 5 6  (需要修正 3,4,5,6)
开始日5          5
MOD1             1 2 3 4 5 6 (需要修正 2,3,4,5,6)
开始日6            6
MOD1               1 2 3 4 5 6 (需要修正 1,2,3,4,5,6)
开始日7              7
MOD1                 1 2 3 4 5 6  (需要修正 1,2,3,4,5,6)

开始日(1-6) 修正因子(F) = MOD2 +1 ,但最大值为 2,
开始日(7) 修正因子(F) = 1 

#7


//可以在循环中把日期转成Calendar格式,然后读取该天的星期:
String xingqi = calendar.toString().substring(calendar.toString().indexOf(
          "DAY_OF_WEEK=") + 12, calendar.toString().indexOf("DAY_OF_WEEK=") + 13);
int xq = Integer.parseInt(xingqi);
//然后判断
if (xq == 1 || xq == 7){//条件还可以增加月日满足条件的假日如(month==10&&day==1)等等
  //处理
}