怎樣求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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章