Este artigo compartilha o código específico para o cálculo Java do horário de trabalho, sem incluir feriados e fins de semana, para sua referência. O conteúdo específico é o seguinte
pacote comum.util; importar java.text.dateFormat; importar java.text.parseException; importar java.text.simpledateFormat; importar java.util.arraylist; importar java.util.calendar; importar java.util.date; importar java.util.LinkedList; importar java.util.list; classe pública CalculeHours {SimpleDateFormat Format = new SimpleDateFormat ("AAAA-MM-DD HH: MM: SS"); // O formato aqui pode ser definido sozinho // Defina o horário de trabalho: o tempo pode ser ajustado de acordo com a situação real int abh = 9; // Horário de trabalho da manhã, hora int abm = 00; // horas de trabalho da manhã, minuto int aeh = 12; // horas de trabalho da manhã, horas de trabalho, aem = 0; = 18; // Norning Horário de trabalho, hora int pem = 0; // Norning Horário de trabalho, minuto int pem = 0; // Norning Horário de trabalho, flutuação minuciosa h1 = abh+(float) abm/60; FLOAT H2 = AEH+(FLOAT) AEM/60; FLOAT H3 = PBH+(FLOAT) PBM/60; FLOAT H4 = PEH+(FLOAT) PEM/60; Horário de flutuação do dia = H2-H1+(H4-H3); // Número de horas de trabalho por dia int DaysPerweek = 5; // Número de dias de trabalho por semana Milsegperday = 1000*60*60*24; // Número de milissegundos por dia Float HoursPerweek = Horas*DaysPerweek; // Número de horas por semana Data do tempo da sequência de entrada T1 = StringTodate (BEGINTIME); // Data de tempo de início real T2 = StringTodate (EndTime); // Tempo final real // Pré -processo o tempo T1 = ProcessbEgIntime (T1); T2 = ProcesendTime (T2); // Se o horário de início for posterior ao fim, retorne 0 se (t1.gettime ()> t2.gettime ()) {return 0; } // o número completo de semanas desde o horário de início até o horário de término int weekCount = (int) ((t2.getTime ()-t1.getTime ())/(MilSecperday*7)); float totalhours = 0; TotalHours += WeekCount * HoursPerweek; // Ajusta o horário de término para que o horário de início e o término esteja dentro de um período de uma semana T2.SetTime (T2.GetTime ()-WeekCount*7*MilSecperday); Int DayCounts = 0; // Registre o dia de trabalho entre o horário de início e o horário de término // Ajuste a hora de início para que o horário de início e o término esteja no mesmo dia ou dentro de dias úteis adjacentes. 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 * Horasperday; flutuar hh1 = t1.gethours () + (float) t1.getminutes ()/60; flutuar hh2 = t2.gethours () + (float) t2.getminutes ()/60; // O processo inicial e final é o mesmo dia se (t1.getday () == t2.getday ()) {float tt = 0; tt = hh2 - hh1; if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt - (h3 -h2); } totalhours += tt; } else {// O processo de partida e final não é no mesmo dia float tt1 = h4 - hh1; flutuar tt2 = hh2 - h1; if (hh1 <= h2) {tt1 = tt1 - (h3 -h2); } if (hh2> = h3) {tt2 = tt2 - (h3 -h2); } totalhours + = (tt1 + tt2); } retornar totalhours; } / * * String xingqi = null; switch (t.getday ()) {case 0: xingqi = "domingo"; quebrar; Caso 1: Xingqi = "Segunda -feira"; quebrar; Caso 2: Xingqi = "Terça -feira"; quebrar; caso 3: xingqi = "quarta -feira"; quebrar; Caso 4: Xingqi = "Quinta -feira"; quebrar; Caso 5: Xingqi = "Sexta -feira"; quebrar; Caso 6: Xingqi = "Sábado"; quebrar; Padrão: quebra; } str = format.format (t)+""+xingqi; retornar str; }/** * Pré -processo no horário de término, para que esteja dentro do período de trabalho no dia útil * @param t * @return */data privada ProcesendTime (data t) {float h = t.gethours () + (float) t.getminutes ()/60; // Se o horário de término for posterior à tarde fora da hora, defina-o para a tarde fora da hora se (h> = h4) {t.Sethours (peh); t.setMinutes (PEM); } else {// Se o horário final estiver entre a tarde fora da hora, defina-o para a manhã fora da hora se (h> = h2 && h <= h3) {t.Sethours (aeh); t.setMinutes (AEM); } else {// Se o horário de término for mais cedo do que a manhã fora da hora, empurre a data adiante um dia e defina o horário para a tarde fora da hora se (t.gethours () <= h1) {t.setTime (t.gettime ()-milsegperday); T.Sethours (PEH); t.setMinutes (PEM); }}} // Se o horário de término for um fim de semana, o horário de término será encaminhado para a tarde após o horário comercial do dia útil mais recente se (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); } if (t.getday () == 6) {t.setTime (t.gettime ()-milsecperday*(t.getday () == 6? 1: 2)); T.Sethours (PEH); t.setMinutes (PEM); } retornar t; }/** * pré -processando o tempo de início * @param t1 * @return */data privada ProcessbeginMe (data t) {float h = t.gethours () + (float) t.getMinutes ()/60; // Se o horário de início for posterior ao tempo de trabalho fora da tarde, pressione o tempo de início um dia se (h> = h4) {t.setTime (t.gettime ()+milsecperday); T.Sethours (ABH); t.setMinutes (ABM); } else {// Se o horário de início estiver entre o intervalo do almoço, então defina o horário de trabalho da tarde se (h> = h2 && h <= h3) {t.Sethours (pbh); t.SetMinutes (PBM); } else {// Se o horário de início for mais cedo do que a hora da manhã de trabalho, defina hora para o horário de trabalho da manhã se (t.gethours () <= h1) {t.Sethours (ABH); t.setMinutes (ABM); }}} // Se a hora de início for um fim de semana, vá depois do horário de início da manhã de trabalho do dia mais recente do dia útil se (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); } retornar t; } / ** * Hora de converter o tempo na forma de uma string para a forma de uma data * @param time * @return * / private data stringtodate (string time) {try {return format.parse (time); } catch (parseException e) {e.printStackTrace (); retornar nulo; }} / ** * Remova os fins de semana e feriados Horários de trabalho * @param BeginTime * @param EndTime * @return * @throws parseException * / public static float calcularhour (string beginTime, string endtime) lança parseException {calculeHours ch = calcularHours (); flutuar a = ch.calculateHours (iniciar, fim de fim); Calendário startday = calendar.getInstance (); Calendário final do dia = calendário.getInstance (); startday.setTime (formatter.parse (iniciante)); endday.setTime (formatter.parse (final)); String [] workday = printday (dia de início, fim de dia); 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"}; Calendário agora = calendar.getInstance (); int ano = agora.get (calendário.year); // Obtenha a lista de anos atual <String> list = new ArrayList <String> (); for (string string: holida) {string = ano+"-"+string; list.add (string); } String [] arr = list.toArray (new String [0]); int férias = arcontrast (dia de trabalho, arr); int holidayhous = feriados*8; flutuar b = (float) (math.round (a*10))/10; Float Work Hours = B-sexta-feira; retornar casas de trabalho; } public static void main (string [] args) lança parseexception {string beginTime = "2018-6-1 9:00:00"; String endtime = "2018-6-4 10:10:00"; Calcule hours ch = new calcularHours (); flutuar b = ch.calculateHours (iniciantes, fim); System.out.println (b); flutuar a = calcularHours.CalculateHour (iniciante, final); System.out.println (a); } / ** * Remova a mesma data na matriz * @param arr1 * @param arr2 * @return * / private static int arcontrast (string [] arr1, string [] arr2) {int count = 0; List <String> list = new LinkedList <String> (); for (string str: ar1) {// Processando a primeira matriz, os valores na lista são 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} para (String str: arr2) {// Se a segunda matriz tiver o mesmo valor que a primeira matriz, exclua if (list.contains (str)) {list.Remove (str); ++ contagem; }} Retornar contagem; } private Data FinalFormats de estática privada = new SimpleDateFormat ("AAAYYY-MM-DD"); String estática privada [] Printday (calendário Startday, calendário final do dia) {list <String> list = new ArrayList <String> (); // Se a data de início da data fornecida for maior que a data de término, a impressão não será executada se (startday.compareto (fim de dia)> = 0) {return new string [] {}; } // a data impressa agora calendário currentPrintday = startDay; while (true) {// Adicione uma data ao currentPrintday.add (calendar.date, 1); // Depois de adicionar uma data para determinar se a data de término é atingida, imprima, será encerrado se (currentPrintday.comPareto (fim de dia) == 0) {break; } list.add (formatter.format (currentPrintDay.getTime ())); } String [] arr = list.toArray (new String [0]); retornar arr; }}O resultado da execução no método principal é:
Existem comentários no código e podem ser ajustados conforme necessário.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.