Este artículo comparte el código específico para el cálculo de Java de las horas de trabajo, sin incluir vacaciones y fines de semana, para su referencia. El contenido específico es el siguiente
paquete común.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; clase pública calculateHours {SimpleDateFormat Format = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); // El formato aquí se puede establecer por usted mismo // Establecer horas de trabajo: el tiempo se puede ajustar de acuerdo con la situación real int abh = 9; // Horas de trabajo de la mañana, hora int abm = 00; // horas de trabajo de la mañana, minuto int aeh = 12; // horas de trabajo de la mañana, hora int aem = 0; // horas de trabajo de trabajo matutinas, intento de trabajo de trabajo. 18; // Horas de trabajo nutrientes, hora int pem = 0; // Horas de trabajo nutrientes, minuto int pem = 0; // Horas de trabajo nutrientes, minuto flotante H1 = abh+(flotante) ABM/60; flotante h2 = aeh+(float) AEM/60; flotante H3 = PBH+(FLOAT) PBM/60; flotante H4 = PEH+(FLOAT) PEM/60; Float Soursperday = H2-H1+(H4-H3); // Número de horas de trabajo por día int daysperweek = 5 ;/ Número de días hábiles por semana MilSecperday = 1000*60*60*24; // número de milisegundos por día floatsperweek = soatesperday*daysperweek; // número de horas por semana float calculoso calculado hurto (brote broteo, brote, floek = Soursperday*daysperweek; // Número de horas por semana Pública Pública Cálculo de cálvulas Hours (String Brotenga broteo, Floatweek. Fecha de hora de cadena T1 = StringTodate (BegInTime); // Fecha de hora de inicio real T2 = StringTodate (Endtime); // Real End Time // Preprocess the Time t1 = ProcessBeGiNtime (t1); t2 = processendtime (t2); // Si la hora de inicio es posterior a la hora de finalización, devuelva 0 if (t1.gettime ()> t2.gettime ()) {return 0; } // El número completo de semanas desde la hora de inicio hasta la hora final int WeekCount = (int) ((t2.gettime ()-t1.gettime ())/(milsepperday*7)); Flotador Totalhours = 0; TotalHours += WeekCount * Soursperweek; // Ajuste la hora de finalización para que la hora de inicio y el tiempo de finalización se encuentren dentro de un período de una semana T2.setTime (T2.GetTime ()-WeekCount*7*MilSecperday); int Daycounts = 0; // Registre el día de trabajo entre la hora de inicio y la hora de finalización // ajuste la hora de inicio para que la hora de inicio y la hora final sean el mismo día, o dentro de los días hábiles adyacentes. while (t1.gettime () <= t2.gettime ()) {date temp = new date (t1.gettime ()+milsepperday); temp = ProcessBeGintime (temp); temp.sethours (t1.gethours ()); temp.setMinutes (t1.getminutes ()); if (temp.gettime ()> t2.gettime ()) {break; } else {t1 = temp; Daycounts ++; }} Totalhours += Daycounts * Soursperday; flotante hh1 = t1.gethours () + (float) t1.getminutes ()/60; flotante hh2 = t2.gethours () + (float) t2.getminutes ()/60; // El proceso de inicio y finalización es el mismo día si (t1.getday () == t2.getday ()) {float tt = 0; TT = HH2 - HH1; if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt - (h3 -h2); } Totalhours += tt; } else {// El inicio y el final del proceso no es el mismo día flotante tt1 = h4 - hh1; flotar tt2 = hh2 - h1; if (hh1 <= h2) {tt1 = tt1 - (h3 -h2); } if (hh2> = h3) {tt2 = tt2 - (h3 -h2); } Totalhours + = (tt1 + tt2); } return Totalhours; } / ** * Tiempo de salida de formato: aaa yyyy-mm-dd hh: mm: ss week x * @param t * @return * / private string printDate (date t) {string str; Cadena xingqi = nulo; switch (t.getday ()) {caso 0: xingqi = "domingo"; romper; Caso 1: xingqi = "lunes"; romper; Caso 2: xingqi = "martes"; romper; Caso 3: xingqi = "miércoles"; romper; Caso 4: xingqi = "jueves"; romper; Caso 5: xingqi = "viernes"; romper; Caso 6: xingqi = "sábado"; romper; predeterminado: ruptura; } str = format.format (t)+""+xingqi; regresar str; }/** * Preprocese la hora de finalización para que esté dentro del período de trabajo dentro del día de trabajo * @param t * @return */private fechor processendtime (fecha t) {float h = t.gethours () + (float) t.getminutes ()/60; // Si la hora final es más tarde de la tarde de la tarde, colóquela en la tarde fuera de hora si (H> = H4) {T.SetHours (PEH); T.SetMinutes (PEM); } else {// Si la hora de finalización es entre la tarde de la tarde, colóquelo en la mañana fuera de la mañana if (h> = h2 && h <= h3) {t.sethours (aeh); T.SetMinutes (AEM); } else {// Si la hora final es antes de la mañana de la mañana, empuje la fecha hacia adelante un día y establezca el tiempo en la tarde fuera de la hora de hora (T.Gethours () <= H1) {T.Settime (T.GetTime ()-MilSecperday); T.Sethours (PEH); T.SetMinutes (PEM); }}} // Si la hora de finalización es un fin de semana, entonces la hora final se enviará a la tarde después del día de trabajo más reciente si (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 ()-milsepperday*(t.getday () == 6? 1: 2)); T.Sethours (PEH); T.SetMinutes (PEM); } if (t.getday () == 6) {t.settime (t.gettime ()-milsepperday*(t.getday () == 6? 1: 2)); T.Sethours (PEH); T.SetMinutes (PEM); } return t; }/** * Preprocesando la hora de inicio * @param t1 * @return */private date processBeGintime (fecha t) {float h = t.gethours () + (float) t.getminutes ()/60; // Si la hora de inicio es posterior a la tarde fuera de la hora de trabajo, presione la hora de inicio un día si (h> = h4) {t.settime (t.gettime ()+milsepperday); T.Sethours (abh); T.SetMinutes (ABM); } else {// Si la hora de inicio está entre el descanso para el almuerzo, luego establezca la hora de trabajo de la tarde si (h> = h2 && h <= h3) {t.sethours (pbh); T.SetMinutes (PBM); } else {// Si la hora de inicio es antes de la hora de trabajo de la mañana, establezca la hora de trabajo de la hora a la mañana si (t.gethours () <= h1) {t.sethours (abh); T.SetMinutes (ABM); }}} // Si la hora de inicio es un fin de semana, luego mueva la hora de inicio a la hora de trabajo de la mañana del día de trabajo más reciente si (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 ()+milsepperday*(t.getday () == 6? 2: 1)); T.Sethours (abh); T.SetMinutes (ABM); } return t; } / ** * Tiempo para convertir la hora en forma de una cadena a la forma de una fecha * @param tiempo * @return * / private fechor stringTodate (horario de cadena) {try {return format.parse (hora); } catch (ParseException e) {E.PrintStackTrace (); regresar nulo; }} / ** * Eliminar los fines de semana y las vacaciones de trabajo * @param begiNTime * @param endtime * @return * @throws parseException * / public static float calculatuleHour (string begInTime, string endtime) arroja parseException {calculateHours ch = new calculateHours (); flotar a = ch.calculateHours (BegIntime, Endtime); Calendar Startday = calendar.getInstance (); Calendario endday = calendar.getInstance (); start sday.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"}; Calendario ahora = calendar.getInstance (); int año = ahora.get (calendar.year); // Obtenga la lista del año actual <String> list = new ArrayList <String> (); for (string string: Holiday) {String = Year+"-"+String; list.add (cadena); } Cadena [] arr = list.toarray (nueva cadena [0]); int Holidays = arrcontrast (día de trabajo, arr); int Holidayhous = Holidays*8; flotante b = (float) (math.round (a*10))/10; casas de trabajo flotantes = B-Holidayhous; devolver casas de trabajo; } public static void main (string [] args) lanza ParseException {String BegInTime = "2018-6-1 9:00:00"; String EndTime = "2018-6-4 10:10:00"; CalculateHours ch = new CalculateHours (); flotante b = ch.calculateHours (BegIntime, Endtime); System.out.println (b); flotar a = calcular casass.calculateHour (BegIntime, Endtime); System.out.println (a); } / ** * Elimine la misma fecha en la matriz * @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) {// procesando la primera matriz, los valores en la lista son 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} for (string str: arr2) {// Si la segunda matriz tiene el mismo valor que la primera matriz, eliminar if (list.contains (str)) {list.remove (str); ++ recuento; }} return Count; } Formatter de Final de fecha final estática privada = new SimpleDateFormat ("yyyy-mm-dd"); cadena estática privada [] printday (calendar startday, calendar endday) {list <string> list = new ArrayList <String> (); // Si la fecha de inicio de la fecha dada es más grande que la fecha de finalización, la impresión no se realizará si (startday.compareto (endday)> = 0) {return new String [] {}; } // La fecha imprimida ahora calendario currentprintday = startday; while (true) {// Agregue una fecha a CurrentPrintday.add (calendar.date, 1); // Después de agregar una fecha para determinar si se alcanza la fecha de finalización, imprima que se terminará si (currentprintday.compareto (endday) == 0) {break; } list.add (formatter.format (currentprintday.gettime ())); } Cadena [] arr = list.toarray (nueva cadena [0]); regresar arr; }}El resultado de la ejecución en el método principal es:
Hay comentarios en el código y se pueden ajustar según sea necesario.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.