程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-怎麼排除兩個日期之間的節假日,下面我這個是計算排除周末的工作時間,怎麼把節假日排除掉,求指教

java-怎麼排除兩個日期之間的節假日,下面我這個是計算排除周末的工作時間,怎麼把節假日排除掉,求指教

編輯:編程綜合問答
怎麼排除兩個日期之間的節假日,下面我這個是計算排除周末的工作時間,怎麼把節假日排除掉,求指教

package server;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CalculateHours {

SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); //這裡的格式可以自己設置 

//設置上班時間:該處時間可以根據實際情況進行調整
int abh = 9;//上午上班時間,小時
int abm = 00;//上午上班時間,分鐘
int aeh = 12;//上午下班時間,小時
int aem = 0;//上午下班時間,分鐘
int pbh = 13;//下午上班時間,小時
int pbm = 00;//下午上班時間,分鐘
int peh = 18;//下午下班時間,小時
int pem = 0;//下午下班時間,分鐘
float h1 = abh+(float)abm/60;
float h2 = aeh+(float)aem/60;
float h3 = pbh+(float)pbm/60;
float h4 = peh+(float)pem/60;
float hoursPerDay = h2-h1+(h4-h3);//每天上班小時數
int daysPerWeek = 6;//每周工作天數
long milsecPerDay = 1000*60*60*24;//每天的毫秒數
float hoursPerWeek = hoursPerDay*daysPerWeek;//每星期小時數
public float calculateHours(String beginTime, String endTime){
    System.out.println("設置的上班時間為:"+abh+":"+abm+"-"+aeh+":"+aem
            +"   "+pbh+":"+pbm+"-"+peh+":"+pem);
    System.out.println("每天工作時間為:"+hoursPerDay+"小時");
    //對輸入的字符串形式的時間進行轉換
    Date t1 = stringToDate(beginTime);//真實開始時間
    Date t2 = stringToDate(endTime);//真實結束時間
    System.out.println("設置的開始時間為:"+printDate(t1));
    System.out.println("設置的結束時間為:"+printDate(t2));
    //對時間進行預處理
    t1 = processBeginTime(t1);
    t2 = processEndTime(t2);
    System.out.println("預處理後的開始時間為:"+printDate(t1));
    System.out.println("預處理後的結束時間為:"+printDate(t2));
    //若開始時間晚於結束時間,返回0
    if(t1.getTime()>t2.getTime()){
        System.out.println("總工作時間為:0小時");
        return 0;
    }
    //開始時間到結束時間的完整星期數
    int weekCount = (int) ((t2.getTime()-t1.getTime())/(milsecPerDay*7));
    System.out.println("時間間隔內共包含了"+weekCount+"個完整的星期");
    float totalHours = 0;
    totalHours += weekCount * hoursPerWeek;
    //調整結束時間,使開始時間和結束時間在一個星期的周期之內
    t2.setTime(t2.getTime()-weekCount*7*milsecPerDay);
    System.out.println("結束時間調整為:"+printDate(t2));
    int dayCounts = 0;//記錄開始時間和結束時間之間工作日天數
    //調整開始時間,使得開始時間和結束時間在同一天,或者相鄰的工作日內。
    while(t1.getTime()<=t2.getTime()){
        Date temp = new Date(t1.getTime()+milsecPerDay);
        temp = processBeginTime(temp);
        temp.setHours(t1.getHours());
        temp.setMinutes(t1.getMinutes());
        if(temp.getTime()>t2.getTime()){
            break;
        }else{
            t1 = temp;
            dayCounts++;
        }
    }
    System.out.println("開始時間向後移動了"+dayCounts+"個工作日");
    System.out.println("開始時間調整為:"+printDate(t1));
    totalHours += dayCounts * hoursPerDay;
    float hh1 = t1.getHours() + (float)t1.getMinutes()/60;
    float hh2 = t2.getHours() + (float)t2.getMinutes()/60;
    //處理開始結束是同一天的情況
    if(t1.getDay()==t2.getDay()){
        float tt = 0;
        tt = hh2 - hh1;
        if(hh1>=h1&&hh1<=h2&&hh2>=h3){
            tt = tt - (h3-h2);
        }
        totalHours += tt;
    }else{
        //處理開始結束不是同一天的情況
        float tt1 = h4 - hh1;
        float tt2 = hh2 - h1;
        if(hh1<=h2){
            tt1 = tt1 - (h3-h2);
        }
        if(hh2>=h3){
            tt2 = tt2 - (h3-h2);
        }
        totalHours += (tt1 + tt2);
    }
    System.out.println("總工作時間為:"+totalHours+"小時");
    return totalHours;
}

/**
 * 格式化輸出時間: yyyy-mm-dd hh:mm:ss 星期x
 * @param t
 * @return
 */
private String printDate(Date t) {
    String str;
    String xingqi = null;
    switch (t.getDay()) {
    case 0:
        xingqi = "星期天";
        break;
    case 1:
        xingqi = "星期一";
        break;
    case 2:
        xingqi = "星期二";
        break;
    case 3:
        xingqi = "星期三";
        break;
    case 4:
        xingqi = "星期四";
        break;
    case 5:
        xingqi = "星期五";
        break;
    case 6:
        xingqi = "星期六";
        break;
    default:
        break;
    }
    str = format.format(t)+"  "+xingqi;
    return str;
}

/**
 * 對結束時間進行預處理,使其處於工作日內的工作時間段內
 * @param t
 * @return
 */
private Date processEndTime(Date t) {
    float h = t.getHours() + (float)t.getMinutes()/60;
    //若結束時間晚於下午下班時間,將其設置為下午下班時間
    if(h>=h4){
        t.setHours(peh);
        t.setMinutes(pem);
    }else {
        //若結束時間介於中午休息時間,那麼設置為上午下班時間
        if(h>=h2&&h<=h3){
            t.setHours(aeh);
            t.setMinutes(aem);
        }else{
            //若結束時間早於上午上班時間,日期向前推一天,並將時間設置為下午下班時間
            if(t.getHours()<=h1){
                t.setTime(t.getTime()-milsecPerDay);
                t.setHours(peh);
                t.setMinutes(pem);
            }
        }
    }
    //若結束時間是周末,那麼將結束時間向前推移到最近的工作日的下午下班時間
    if(t.getDay()==0){
        t.setTime(t.getTime()-milsecPerDay*(t.getDay()==6?1:2));
        t.setHours(peh);
        t.setMinutes(pem);
    }
    return t;
}

/**
 * 對開始時間進行預處理
 * @param t1
 * @return
 */
private Date processBeginTime(Date t) {
    float h = t.getHours() + (float)t.getMinutes()/60;
    //若開始時間晚於下午下班時間,將開始時間向後推一天
    if(h>=h4){
        t.setTime(t.getTime()+milsecPerDay);
        t.setHours(abh);
        t.setMinutes(abm);
    }else {
        //若開始時間介於中午休息時間,那麼設置為下午上班時間
        if(h>=h2&&h<=h3){
            t.setHours(pbh);
            t.setMinutes(pbm);
        }else{
            //若開始時間早於上午上班時間,將hour設置為上午上班時間
            if(t.getHours()<=h1){
                t.setHours(abh);
                t.setMinutes(abm);
            }
        }
    }
    //若開始時間是周末,那麼將開始時間向後推移到最近的工作日的上午上班時間
    if(t.getDay()==0){
        t.setTime(t.getTime()+milsecPerDay*(t.getDay()==6?2:1));
        t.setHours(abh);
        t.setMinutes(abm);
    }
    return t;
}

/**
 * 將字符串形式的時間轉換成Date形式的時間
 * @param time
 * @return
 */
private Date stringToDate(String time){
    try {
        return format.parse(time);
    } catch (ParseException e) {
        e.printStackTrace();
        return null;
    }
}
public static void main(String[] args) {
    String beginTime = "2015-08-28 10:00:00";  
    String endTime = "2015-08-31 13:30:00";  
    CalculateHours ch = new CalculateHours();  
    float a=ch.calculateHours(beginTime, endTime);  
    System.out.println(a);
    float  b   =  (float)(Math.round(a*10))/10;
    System.out.println(b);

}

}

最佳回答:


/*
*實現思路
*1. 判斷指定日期是否掉是雙休日
*2. 在通過獲取指定日期的 月和日 判斷是否是節假
*3. 判斷是否有節假日 雙休加班情況
*4. 如果上面的你已經了解,那麼得到工作日就簡單了,不寫了,自己通過需求加上
*/
public void isOverDay(){ // 指定時間判斷是否是雙休日
String dates = "2013-05-13"; // 這裡可以自定義
DateFormat df = new SimpleDateFormat("yy-MM-dd");
Date d;

try {

d= df.parse("");
if (d.getDay() == 0 || d.getDay() == 6){
System.out.println("日期:[" + dates + "] 是雙休日");
}else{

System.out.println("日期:[" + dates + "] 不是雙休日");

}
}catch (Exception e)
{

e.printStackTrace();
}
}

public void isHodliDays(){  // 判斷是否滴節假日,是否有節假日加班
    //中國法定節假日期
    String isHoliday="01-01,01-02,01-03,02-09,02-10,02-11,02-12,02-13,02-14," +
                     "02-15,04-04,04-05,04-06,04-29,04-30,05-01,06-10,06-11," +
                     "06-12,09-19,09-20,09-21,10-01,10-02,10-03,10-04,10-05,10-06,10-07";

    //節假前後加班日期
    String overDay="01-05,01-06,02-16,02-17,04-07,04-17,04-28,06-08,06-09,09-22,09-19,10-12";

    //指定的 月份和日期
    String date="10-12";  // 這裡可以自定義

    if (isHoliday.contains(date)) {
        System.out.println("是節假日...");
    }if (overDay.contains(date)) {
        System.out.println("節假前後加班日期...");
    }
}

這個你參考一下
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved