이 기사에서는 참조를 위해 공휴일 및 주말을 제외하고는 근무 시간의 Java 계산을위한 특정 코드를 공유합니다. 특정 내용은 다음과 같습니다
패키지 common.util; import java.text.dateformat; import java.text.parseexception; import java.text.simpledateformat; java.util.arraylist 가져 오기; java.util.calendar 가져 오기; import java.util.date; java.util.linkedList 가져 오기; Java.util.list 가져 오기; 공개 클래스 계산 시간 {simpledateformat format = new simpledateformat ( "yyyy-mm-dd hh : mm : ss"); // 여기서 형식은 직접 설정할 수 있습니다. // 작업 시간 설정 : 실제 상황에 따라 시간을 조정할 수 있습니다 int abh = 9; // 아침 근무 시간, 시간 int abm = 00; // 아침 근무 시간, 미세한 int aeh = 12; // 아침 근무 시간, 시간 int aem = // 아침 int pbh = 13; int pbm = 00; 18; // 노동 근무 시간, 시간 int pem = 0; // 노르 닝 근무 시간, 미세한 int pem = 0; // 노르 닝 근무 시간, 미세한 플로트 h1 = abh+(float) abm/60; float h2 = aeh+(float) aem/60; float h3 = pbh+(float) pbm/60; float h4 = peh+(float) pem/60; float himsperday = h2-h1+(h4-h3); // 하루에 근무 시간 int daysperweek = 5; // 일주일 당 근무일 횟수 milsecperday = 1000*60*60*24; // 하루에 밀리 초의 수 플로트 러브 러브 러브 러브 러브 러브 러브 러브 러드 횟수 t1 = stringtodate (begintime); // 실제 시작 시간 날짜 t2 = stringtodate (endtime); // 실제 종료 시간 // 시간 t1 = processbegintime (t1); T2 = ProcessEndTime (T2); // 시작 시간이 종료 시간보다 늦으면 (t1.gettime ()> t2.gettime ()) {return 0; } // 시작 시간부터 종료 시간까지의 전체 주 int int weekcount = (int) ((t2.gettime () -t1.gettime ())/(milsecperday*7)); float totalhours = 0; Totalhours += WeekCount * Houtsperweek; // 시작 시간과 종료 시간이 1 주 기간 내에 있도록 종료 시간을 조정하십시오 (t2. gettime () -weekcount*7*milsecperday); int daycounts = 0; // 시작 시간과 종료 시간 사이의 근무일을 기록하십시오. // 시작 시간과 종료 시간이 같은 날 또는 인접한 근무일 내에 시작 시간을 조정하십시오. while (t1.gettime () <= t2.gettime ()) {date temp = new 날짜 (t1.gettime ()+milsecperday); 임시 = ProcessBegIntime (온도); 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; // 프로세스 시작 및 종료는 (t1.getDay () == t2.getDay ()) {float tt = 0; TT = HH2 -HH1; if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt- (h3 -h2); } Totalhours += tt; } else {// 프로세스 시작과 끝은 같은 날 플로트 tt1 = h4 -hh1; 플로트 TT2 = HH2 -H1; if (hh1 <= h2) {tt1 = tt1- (h3 -h2); } if (hh2> = h3) {tt2 = tt2- (h3 -h2); } Totalhours + = (tt1 + tt2); } 총 시간을 반환합니다. } / ** * 형식 출력 시간 : yyyy-mm-dd hh : mm : ss week x * @param t * @return * / private String printDate (date t) {String str; 문자열 xingqi = null; switch (t.getday ()) {case 0 : xingqi = "일요일"; 부서지다; 사례 1 : Xingqi = "월요일"; 부서지다; 사례 2 : Xingqi = "화요일"; 부서지다; 사례 3 : Xingqi = "수요일"; 부서지다; 사례 4 : Xingqi = "목요일"; 부서지다; 사례 5 : Xingqi = "금요일"; 부서지다; 사례 6 : Xingqi = "토요일"; 부서지다; 기본값 : 브레이크; } str = format.format (t)+""+xingqi; Return str; }/** * 근무일 근무 기간 내에 있도록 종료 시간을 전처리하십시오 * @param t * @return */개인 날짜 processendtime (date t) {float h = t.gethours () + (float) t.getMinutes ()/60; // 종료 시간이 오후 오후에 늦어지면 오후 오후 시간에 (h> = h4) {T.sethours (peh); T. 세트 분기 (PEM); } else {// 종료 시간이 오후 오후 시간 사이에 있으면 (h> = h2 && h <= h3) {t.sethours (aeh); T. 세트 분기 (AEM); } else {// 종료 시간이 오전 시간보다 이른 경우 날짜를 하루를 앞으로 밀고 (t.gethours () <= h1) {t.settime (t.gettime () -MilsecperDay); T.Sethours (PEH); T. 세트 분기 (PEM); }}} // 종료 시간이 주말 인 경우 종료 시간은 (T.getday () == 0) {T.settime (t.gettime () -MilsecperDay*(t.getDay () == 6? 1 : 2)) 인 경우 가장 최근의 근무일 오후에 오후로 전달됩니다. T.Sethours (PEH); T. 세트 분기 (PEM); } if (t.getday () == 6) {T.settime (t.gettime () -milsecperday*(t.getday () == 6? 1 : 2)); T.Sethours (PEH); T. 세트 분기 (PEM); } if (t.getday () == 6) {T.settime (t.gettime () -milsecperday*(t.getday () == 6? 1 : 2)); T.Sethours (PEH); T. 세트 분기 (PEM); } return t; }/** * 시작 시간 전처리 * @param t1 * @return */개인 날짜 processBegintime (date t) {float h = t.gethours () + (float) t.getMinutes ()/60; // 시작 시간이 오후에 근무 시간을 벗어나는 경우 (h> = h4) {t.settime (t.gettime ()+milsecperday); T.Sethours (ABH); T. 세트 분기 (ABM); } else {// 시작 시간이 점심 시간 사이에있는 경우 (h> = h2 && h <= h3) {t.sethours (pbh); T. 세트 분기 (PBM); } else {// 시작 시간이 아침 근무 시간보다 이른 경우 (t.gethours () <= h1) {t.sethours (abh); T. 세트 분기 (ABM); }}} // 시작 시간이 주말 인 경우 시작 시간을 가장 최근의 근무일의 아침 근무 시간으로 다시 이동합니다 (t.getday () == 0) {T.settime (t.gettime ()+milsecperday*(t.getday () == 6? 2 : 1)); T.Sethours (ABH); T. 세트 분기 (ABM); } if (t.getday () == 6) {T.settime (t.gettime ()+milsecperday*(t.getday () == 6? 2 : 1)); T.Sethours (ABH); T. 세트 분기 (ABM); } return t; } / ** * 문자열 형식으로 시간을 날짜 형식으로 변환하는 시간 * @param time * @return * / private date StringTodate (문자열 시간) {try {return format.parse (time); } catch (parseException e) {e.printstacktrace (); 널 리턴; }} / ** * 주말 및 휴일 제거 근무 시간 제거 * @param begintime * @param endtime * @return * @throws parseexception * / public static float accemulatehour (String begintime, String endtime) parseexception {calculatehours ch = new CalculateHours (); float a = chalculatehours (begintime, endtime); Calendar startday = calendar.getInstance (); Calendar endday = calendar.getInstance (); startday.settime (formatter.parse (begintime)); endday.settime (formatter.parse (endtime)); 문자열 [] 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"}; 캘린더 now = calendar.getInstance (); int 년 = now.get (calendar.year); // 현재 연도 목록을 가져옵니다 <string> list = new ArrayList <string> (); for (문자열 문자열 : Holiday) {String = Year+"-"+String; list.add (문자열); } string [] arr = list.toArray (새 문자열 [0]); int holidays = arrcontrast (Workday, Arr); int holidayhous = 휴일*8; float b = (float) (math.round (a*10))/10; 플로트 워크 쇼 = B- 홀로이 셔; 반환 작업 시간; } public static void main (String [] args)은 parseexception {String begintime = "2018-6-1 9:00:00"; 문자열 endtime = "2018-6-4 10:10:00"; 계산 시간 CH = New CalculateHours (); float b = chalculatehours (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) {// 첫 번째 배열을 처리하면 목록의 값은 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} for (string str : arr2) {// 두 번째 배열이 첫 번째 배열과 동일한 값을 갖는 경우 if (list.contains (str)) {list.remove (str); ++ 수; }} 반환 수; } private static final dateformat formatter = new simpledateformat ( "yyyy-mm-dd"); private static string [] printday (Calendar Startday, Calendar Endday) {list <string> list = new Arraylist <string> (); // 주어진 날짜 시작 날짜가 종료 날짜보다 큰 경우 (startday.compareto (endday)> = 0) {return new String [] {}; } // 인쇄 된 날짜는 지금 캘린더 currentPrintday = 시작일; while (true) {// currentprintday.add에 한 날짜를 추가합니다 (calendar.date, 1); // 종료 날짜에 도달했는지 여부를 결정하기 위해 한 날짜를 추가 한 후 (currentprintday.compareto (endday) == 0) {break; } list.add (formatter.format (currentprintday.gettime ()); } string [] arr = list.toArray (새 문자열 [0]); 반환 ARR; }}주요 방법에서 실행 결과는 다음과 같습니다.
코드에는 주석이 있으며 필요에 따라 조정할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.