자바 근무 시간 계산 공휴일 및 휴일 제외

본 논문 의 사례 는 자바 가 근무 시간 을 계산 하 는 구체 적 인 코드 를 공유 하 였 으 며,공휴일,휴일 을 포함 하지 않 으 므 로,여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.

package common.util; 
import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.LinkedList; 
import java.util.List; 
 
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 = 5;//       
  long milsecPerDay = 1000*60*60*24;//       
  float hoursPerWeek = hoursPerDay*daysPerWeek;//       
  public float calculateHours(String beginTime, String endTime){ 
    //                 
    Date t1 = stringToDate(beginTime);//       
    Date t2 = stringToDate(endTime);//       
    //         
    t1 = processBeginTime(t1); 
    t2 = processEndTime(t2); 
    //           ,  0 
    if(t1.getTime()>t2.getTime()){ 
      return 0; 
    } 
    //                
    int weekCount = (int) ((t2.getTime()-t1.getTime())/(milsecPerDay*7)); 
    float totalHours = 0; 
    totalHours += weekCount * hoursPerWeek; 
    //      ,                     
    t2.setTime(t2.getTime()-weekCount*7*milsecPerDay); 
    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++; 
      } 
    } 
    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); 
    } 
    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); 
    } 
    if(t.getDay()==6){ 
      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); 
    }if(t.getDay()==6){ 
      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; 
    } 
  } 
  /** 
   *             
   * @param beginTime 
   * @param endTime 
   * @return 
   * @throws ParseException 
   */ 
  public static float CalculateHour(String beginTime,String endTime) throws ParseException{ 
    CalculateHours ch = new CalculateHours(); 
    float a=ch.calculateHours(beginTime, endTime);  
    Calendar startDay = Calendar.getInstance(); 
     Calendar endDay = Calendar.getInstance(); 
     startDay.setTime(FORMATTER.parse(beginTime)); 
     endDay.setTime(FORMATTER.parse(endTime)); 
    String[] workday=printDay(startDay, endDay); 
    String[] holiday = new String[]{"01-01","01-02","01-03","05-01","05-02","05-03","10-01","10-02", 
        "10-03","10-04","10-05","10-06","02-08","02-09","02-10"}; 
    Calendar now = Calendar.getInstance();  
    int year=now.get(Calendar.YEAR); //       
    List<String> list = new ArrayList<String>(); 
    for (String string : holiday) { 
      string=year+"-"+string; 
      list.add(string); 
    } 
    String[] arr = list.toArray(new String[0]); 
    int holidays = arrContrast(workday, arr);  
    int holidayHous=holidays*8; 
    float b  = (float)(Math.round(a*10))/10; 
    float workHours=b-holidayHous; 
    return workHours; 
  } 
  public static void main(String[] args) throws ParseException { 
    String beginTime = "2018-6-1 9:00:00";  
    String endTime = "2018-6-4 10:10:00";  
    CalculateHours ch = new CalculateHours(); 
    float b=ch.calculateHours(beginTime, endTime); 
    System.out.println(b); 
    float a=CalculateHours.CalculateHour(beginTime, endTime); 
    System.out.println(a); 
  } 
  /** 
   *           
   * @param arr1 
   * @param arr2 
   * @return 
   */ 
  private static int arrContrast(String[] arr1, String[] arr2){ 
    int count=0; 
    List<String> list = new LinkedList<String>(); 
    for (String str : arr1) { //       ,list     1,2,3,4 
      if (!list.contains(str)) { 
      list.add(str); 
      } 
    } 
    for (String str : arr2) { //                   ,    
      if(list.contains(str)){ 
      list.remove(str); 
      ++count; 
      } 
    } 
    return count; 
  } 
  private static final DateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); 
  private static String[] printDay(Calendar startDay, Calendar endDay) { 
     List<String> list = new ArrayList<String>(); 
     //                     
     if (startDay.compareTo(endDay) >= 0) { 
      return new String[]{}; 
     } 
   //          
   Calendar currentPrintDay = startDay; 
   while (true) { 
    //      
    currentPrintDay.add(Calendar.DATE, 1); 
    //               ,        
    if (currentPrintDay.compareTo(endDay) == 0) { 
    break; 
    } 
    list.add(FORMATTER.format(currentPrintDay.getTime())); 
   } 
    String[] arr = list.toArray(new String[0]); 
    return arr; 
   } 
} 
main 방법의 실행 결 과 는 다음 과 같 습 니 다.

코드 에 주석 이 있어 서 필요 에 따라 스스로 조절 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기