怎样求2个日期间隔的工作日数?解决

还有很多要完善的地方,还有简单的实现没?希望各位帮我提提意见。。。。。

/*步骤: 类CountDaysByDate
* 1、中间天数处理
* 2、开始时间处理
* 3、结束时间处理
*/
private static int[] val = new int[] { 1, 7 };// 默认休息日为 六,日

private static double WORK_DAY_COUNT = 7.5; //定义一天的有几个小时

//设置上下班时间、中午休息时间
private static int AM_START_HOUR = 9;
private static int AM_START_MINUTE = 0;
private static int AM_END_HOUR = 12;
private static int AM_END_MINUTE = 0;
private static int PM_START_HOUR = 13;
private static int PM_START_MINUTE = 0;
private static int PM_END_HOUR = 17;
private static int PM_END_MINUTE = 30;
private static double NOON_REST = 1;

/**
* 计算2个日期相差天数(排除休息日)
* @param beginDateStr
* @param endDateStr
* @return
* 步骤:
* 1、中间天数处理
* 2、开始时间处理
* 3、结束时间处理
*/
@SuppressWarnings("deprecation")
public static double getDaysByDate(String beginDateStr,String endDateStr){
double result = 0;
double restTime = NOON_REST;//中午休息时间
Calendar beginCalendar = getCalendar(beginDateStr);
Calendar endCalendar = getCalendar(endDateStr);
/**1、中间天数处理**/
int days = getMargin(beginDateStr, endDateStr);
/**2、开始时间处理**/
if(days>0){//不是同一天
//开始天上午工作开始-结束时间
Calendar amStartWork1 = setHourAndMinute(getCalendar(beginDateStr),AM_START_HOUR,AM_START_MINUTE);
Calendar amEndWork1 = setHourAndMinute(getCalendar(beginDateStr),AM_END_HOUR,AM_END_MINUTE);
//开始天下午工作开始-结束时间
//Calendar pmStartWork1 = setHourAndMinute(getCalendar(beginDateStr),PM_START_HOUR,PM_START_MINUTE);
Calendar pmEndWork1 = setHourAndMinute(getCalendar(beginDateStr),PM_END_HOUR,PM_END_MINUTE);
beginCalendar = setOverTime(beginDateStr);
//计算开始天还有多少分钟
int bvalue = 0;
if(beginCalendar.compareTo(amStartWork1)>=0 && beginCalendar.compareTo(pmEndWork1)<=0){//beginCalendar<=pmEndWork1
bvalue = ((int)(pmEndWork1.getTimeInMillis() - beginCalendar.getTimeInMillis()))/(60*1000) ;
if(beginCalendar.compareTo(amEndWork1)<0){//beginCalendar<amEndWork1
bvalue -= (int)(restTime*60);
}
}
/**3、结束时间处理**/
//末尾天上午工作开始-结束时间
Calendar amStartWork2 = setHourAndMinute(getCalendar(endDateStr),AM_START_HOUR,AM_START_MINUTE);
Calendar amEndWork2 = setHourAndMinute(getCalendar(endDateStr),AM_END_HOUR,AM_END_MINUTE);
//末尾天下午工作开始-结束时间
//Calendar pmStartWork2 = setHourAndMinute(getCalendar(endDateStr),PM_START_HOUR,PM_START_MINUTE);
Calendar pmEndWork2 = setHourAndMinute(getCalendar(endDateStr),PM_END_HOUR,PM_END_MINUTE);
endCalendar = setOverTime(endDateStr);
//计算末尾天还有多少分钟
int evalue = 0;
if(endCalendar.compareTo(amStartWork2)>=0 && endCalendar.compareTo(pmEndWork2)<=0){//endCalendar<=pmEndWork2
evalue = ((int)(pmEndWork2.getTimeInMillis() - endCalendar.getTimeInMillis()))/(60*1000) ;
if(endCalendar.compareTo(amEndWork2)<0){//endCalendar<amEndWork2
evalue -= (int)(restTime*60);
}
}
double total = (bvalue - evalue)/((double)WORK_DAY_COUNT*60);
result = days + total;
result = ((int)(result*100))/(double)100;
}else{//同一天
int bvalue = 0;
if(endCalendar.compareTo(beginCalendar)>0 ){//endCalendar>beginCalendar
//上午工作开始-结束时间
//Calendar amStartWork1 = setHourAndMinute(getCalendar(beginDateStr),AM_START_HOUR,AM_START_MINUTE);
Calendar amEndWork1 = setHourAndMinute(getCalendar(beginDateStr),AM_END_HOUR,AM_END_MINUTE);
//下午工作开始-结束时间
Calendar pmStartWork1 = setHourAndMinute(getCalendar(beginDateStr),PM_START_HOUR,PM_START_MINUTE);
//Calendar pmEndWork1 = setHourAndMinute(getCalendar(beginDateStr),PM_END_HOUR,PM_END_MINUTE);
beginCalendar = setOverTime(beginDateStr);
endCalendar = setOverTime(endDateStr);
/**2中情况:特殊的->《9:00~17:00》; 普通的->《9:00~12:00》《13:00~17:00》;**/
bvalue = ((int)(endCalendar.getTimeInMillis() - beginCalendar.getTimeInMillis()))/(60*1000) ;
if(beginCalendar.compareTo(amEndWork1)<0 && endCalendar.compareTo(pmStartWork1)>0){//beginCalendar<amEndWork1
bvalue -= (int)(restTime*60);
}
double total = (bvalue)/((double)WORK_DAY_COUNT*60);
result = ((int)(total*100))/(double)100;
}else{
result = 0;
}
}
return result;
}

/**
* 设置时间在工作时间范围内
* @param base
* @param amSw
* @param amEw
* @param pmSw
* @param pmEw
* @return
*/
public static Calendar setOverTime(String base){
Calendar cal = getCalendar(base);
//上午工作开始-结束时间
Calendar amSw = setHourAndMinute(getCalendar(base),AM_START_HOUR,AM_START_MINUTE);
Calendar amEw = setHourAndMinute(getCalendar(base),AM_END_HOUR,AM_END_MINUTE);
//下午工作开始-结束时间
Calendar pmSw = setHourAndMinute(getCalendar(base),PM_START_HOUR,PM_START_MINUTE);
Calendar pmEw = setHourAndMinute(getCalendar(base),PM_END_HOUR,PM_END_MINUTE);
if(cal.before(amSw)){//如果操作日期为上午工作开始时间之前,指定一个默认值
cal = setHourAndMinute(cal,AM_START_HOUR,AM_START_MINUTE);
}else if(cal.after(amEw) && cal.before(pmSw)){//如果操作日期为12:00~13:00,指定一个默认值
cal = setHourAndMinute(cal,PM_START_HOUR,PM_START_MINUTE);
}else if(cal.after(pmEw) ){//如果操作日期为17:30后 cal = setHourAndMinute(cal,PM_END_HOUR,PM_END_MINUTE);
}else if(cal.compareTo(amEw)==0 || cal.compareTo(pmSw)==0){
cal = setHourAndMinute(cal,PM_START_HOUR,PM_START_MINUTE);//如果操作日期为12:00/13:00
}
return cal;
}

/**
* 取得2个日期之间的休息日数目
* @param sDate
* @param eDate
* @return
*/
@SuppressWarnings("static-access")
public static int getRestDays(String bDateStr,String eDateStr){
int days = 0;
Calendar bDate = getCalendar(bDateStr);
Calendar eDate = getCalendar(eDateStr);
while(eDate.after(bDate)){
//判断是否有休息日
for (int i = 0; i < val.length; i++) {
if (bDate.get(bDate.DAY_OF_WEEK) == val[i]) {
days ++;
}
}
bDate.add(bDate.DATE,1);
}
return days;
}

/**
* 计算2个日期之间的天数(排除休息日),例如:2009-04-07 15:00:00 ~ 2009-04-09 15:00:00之间只有2009-04-08一天,则返回1,此处可加入排除节假日的方法。。。。。。
* @param bDateStr
* @param eDateStr
* @return
*/
@SuppressWarnings("static-access")
public static int getMargin(String bDateStr, String eDateStr) {
int margin;
int resDays = 0;
try {
Calendar bDate = getCalendar(bDateStr);
Calendar eDate = getCalendar(eDateStr);
long l = eDate.getTimeInMillis() - bDate.getTimeInMillis();
margin = (int) (l /(24 * 60 * 60 * 1000));
while(eDate.after(bDate)){//判断是否有休息日
for (int i = 0; i < val.length; i++) {
if (bDate.get(bDate.DAY_OF_WEEK) == val[i]) {
resDays ++;
}
}
bDate.add(bDate.DATE,1);
}
return (int)(margin-resDays);
} catch (Exception e) {
return 0;
}
}

/**
* 根据日期字符串得到它的Calendar对象
*
* @param date
* @param df
* @return
*/
public static Calendar getCalendar(String date) {
Calendar da = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");// 定义时间格式
SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");// 定义时间格式
try {

try{
da.setTime(df.parse(date));
}catch(Exception ex){
da.setTime(df1.parse(date));
}
} catch (ParseException e) {
e.printStackTrace();
}
return da;
}

/**
* Calendar时分设置辅助方法
* @param cal
* @param hour
* @param minute
* @return
*/
public static Calendar setHourAndMinute(Calendar cal,int hour,int minute){
cal.set(Calendar.HOUR_OF_DAY,hour);
cal.set(Calendar.MINUTE,minute);
return cal;
}

public static void main(String[] args) {
String str1 = "2009-04-07 12:00:00";
String str2 = "2009-04-08 13:45:00";
double days = CountDaysByDate.getDaysByDate(str1, str2);
System.out.println(str1+"-》"+str2+"=="+days);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章