Dieser Artikel teilt den spezifischen Code für die Java -Berechnung der Arbeitszeiten ohne Feiertage und Wochenenden für Ihre Referenz. Der spezifische Inhalt ist wie folgt
Paket Common.util; Java.Text.DateFormat importieren; Java.text.ParseException importieren; Java.Text.SimpledateFormat importieren; Import Java.util.ArrayList; import Java.util.calendar; import Java.util.date; import Java.util.linkedList; importieren java.util.list; öffentliche Klasse berechnen {SimpledateFormat format = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"); //The format here can be set by yourself//Set working hours: the time can be adjusted according to the actual situation int abh = 9;//Morning working hours, hour int abm = 00;//Morning working hours, minute int aeh = 12;//Morning working hours, hour int aem = 0;//Morning working hours, minute int pbh = 13;//Norning working hours, hour int pbm = 00;//Norning working hours, minute int peh = 18. float h2 = aeh+(float) aem/60; float h3 = pbh+(float) pbm/60; float h4 = peh+(float) pem/60; float stundentag = H2-H1+(H4-H3); // Anzahl der Arbeitszeiten pro Tag int Daysperweek = 5; // Anzahl der Arbeitstage pro Woche lang Milsecperday = 1000*60*60*24; // Anzahl der Millisekunden pro Tag Float stundenwahlen T1 = StringTodate (BeginTime); // reales Startzeitdatum t2 = stringTodate (endzeit); // reale Endzeit // Die Zeit t1 = processBegintime (T1) vorab zusammenarbeiten; T2 = ProcessendTime (T2); // Wenn die Startzeit später als die Endzeit ist, geben Sie 0 if (t1.getTime ()> t2.getTime ()) {return 0; } // Die volle Anzahl von Wochen von der Startzeit bis zur Endzeit int weekcount = (int) ((t2.getTime ()-t1.getTime ())/(milsecperday*7)); Float Totalhours = 0; Totalhours += WeekCount * Stundenperweek; // Passen Sie die Endzeit so an, dass die Startzeit und die Endzeit innerhalb einer Woche T2.Settime (t2.getTime ()-WeekCount*7*Milsecperday) liegen; Int DayCounts = 0; // Notieren Sie den Arbeitstag zwischen der Startzeit und der Endzeit // Die Startzeit so anpassen, dass die Startzeit und die Endzeit am selben Tag oder innerhalb der angrenzenden Arbeitstage liegen. while (t1.getTime () <= t2.getTime ()) {Date temp = neues Datum (t1.getTime ()+milsecperday); temp = processBegintime (temp); temp.sethoors (t1.gethours ()); temp.setminutes (t1.getminutes ()); if (temp.getTime ()> t2.getTime ()) {break; } else {t1 = temp; Tagesberichte ++; }} Gesamthours += DayCounts * Stunden; float hh1 = t1.gethours () + (float) t1.getminutes ()/60; float hh2 = t2.gethours () + (float) t2.getMinutes ()/60; // Der Prozessstart und Ende ist der gleiche Tag, wenn (t1.getday () == t2.getday ()) {float tt = 0; TT = HH2 - HH1; if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt - (H3 -H2); } Totalhours += tt; } else {// Der Prozessstart und Ende ist nicht am selben Tag 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; } / ** * Formatausgabezeit: yyyy-mm-dd hh: mm: ss week x * @param t * @return * / private String printdate (Datum t) {String str; String xingqi = null; switch (t.getay ()) {case 0: xingqi = "sunday"; brechen; Fall 1: Xingqi = "Montag"; brechen; Fall 2: Xingqi = "Dienstag"; brechen; Fall 3: Xingqi = "Mittwoch"; brechen; Fall 4: Xingqi = "Donnerstag"; brechen; Fall 5: Xingqi = "Friday"; brechen; Fall 6: Xingqi = "Samstag"; brechen; Standard: Break; } str = format.format (t)+""+xingqi; return str; }/** * Die Endzeit vorarbeiten, so dass sie innerhalb der Arbeitsperiode innerhalb des Arbeitstages liegt // Wenn die Endzeit später als der Nachmittag außerhalb der Stunde ist, stellen Sie sie auf den Nachmittag außerhalb der Stunde ein, wenn (h> = h4) {t.sethours (peh); T.SetMinutes (PEM); } else {// Wenn die Endzeit zwischen dem Nachmittag außerhalb der Stunde liegt, stellen Sie es auf die morgendliche Ablauf-Stunde, wenn (h> = h2 && h <= h3) {t.sethoors (aeh); T.SetMinutes (AEM); } else {// Wenn die Endzeit früher als die morgendliche Ablauf ist, drücken Sie das Datum eines Tages nach vorne und setzen Sie die Uhrzeit auf den Nachmittag außerhalb der Stunde, wenn (t.gethours () <= h1) {T.Settime (T.GetTime ()-Milsecperday); T.Sethours (PEH); T.SetMinutes (PEM); }}} // Wenn die Endzeit ein Wochenende ist, wird die Endzeit an die Nachmittags nach den Stunden des letzten Arbeitstages weitergeleitet, wenn (t.getay () == 0) {t.settime (t.getTime ()-milsecperday*(t.getday () == 6? 1: 2)); T.Sethours (PEH); T.SetMinutes (PEM); } if (t.getay () == 6) {t.settime (t.getTime ()-milsecperday*(t.getay () == 6? 1: 2)); T.Sethours (PEH); T.SetMinutes (PEM); } if (t.getay () == 6) {t.settime (t.getTime ()-milsecperday*(t.getay () == 6? 1: 2)); T.Sethours (PEH); T.SetMinutes (PEM); } return t; }/** * Vorbereitung der Startzeit * @param t1 * @return */private Datum processBegintime (Datum t) {float h = t.gethours () + (float) t.getminutes ()/60; // Wenn die Startzeit später als der Nachmittag aus der Arbeitszeit aus der Arbeitszeit liegt, schieben Sie die Startzeit eines Tages zurück, wenn (h> = h4) {t.settime (t.getTime ()+milsecperday); T.Sethours (ABH); T.SetMinutes (ABM); } else {// Wenn sich die Startzeit zwischen der Mittagspause befindet, setzen Sie sich auf die Arbeitszeit am Nachmittag ein, wenn (h> = h2 && h <= h3) {t.sethours (pbh); T.SetMinutes (PBM); } else {// Wenn die Startzeit in der Arbeitszeit am Morgen ist, setzen Sie Stunde bis Morgenarbeit, wenn (t.gethours () <= h1) {t.sethours (ABH); T.SetMinutes (ABM); }}} // Wenn die Startzeit ein Wochenende ist, verschieben Sie die Startzeit wieder in die morgendliche Arbeitszeit des letzten Arbeitstages, wenn (t.getday () == 0) {t.settime (t.getTime ()+milsecperday*(t.getay () == 6? 2: 1); T.Sethours (ABH); T.SetMinutes (ABM); } if (t.getay () == 6) {t.settime (t.getTime ()+milsecperday*(t.getay () == 6? 2: 1)); T.Sethours (ABH); T.SetMinutes (ABM); } return t; } / ** * Zeit, um die Zeit in Form einer Zeichenfolge in die Form eines Datums umzuwandeln } catch (parseException e) {e.printstacktrace (); null zurückkehren; }} / ** * Wochenenden und Feiertage Arbeitszeiten entfernen * @Param Begintime * @param endzeit * @return * @throws ParseException * / public static float calculateHour (String BeginTime, String endzeit) löscht ParseException {CalculateHeurs ch = neue calcultours (); float a = ch.calculatehours (BeginTime, Endzeit); Kalender startday = calendar.getInstance (); Kalender endday = calendar.getInstance (); startday.settime (formatter.Parse (BeginTime)); Endday.Settime (Formatter.Parse (Endime)); 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"}; Kalender jetzt = calendar.getInstance (); int Year = Now.get (Kalender.YEAR); // Erhalten Sie die aktuelle Jahresliste <string> list = new ArrayList <string> (); für (String String: Holiday) {String = Jahr+"-"+String; list.add (String); } String [] arr = list.toArray (neue String [0]); int Holidays = arrContrast (Arbeitstag, arr); int Holidayhous = Feiertage*8; float b = (float) (math.round (a*10))/10; Float Workhours = B-Holidayhous; Rückkehr Arbeitsplätze; } public static void main (String [] args) löst ParseException aus {String begannintime = "2018-6-1 9:00:00"; String endime = "2018-6-4 10:10:00"; Berechnen Siehours CH = neue Berechnung (); float b = ch.calculatehours (BeginTime, Endime); System.out.println (b); float a = calculatehours.calculateHour (BeginTime, Endime); System.out.println (a); } / ** * das gleiche Datum im Array entfernen * @param arr1 * @param arr2 * @return * / private statische int arrContrast (string [] arr1, string [] arr2) {int count = 0; Liste <String> list = new LinkedList <String> (); Für (String Str: arr1) {// Verarbeitung des ersten Arrays sind die Werte in der Liste 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} für (string str: arr2) {// Wenn das zweite Array den gleichen Wert wie das erste Array hat, löschen Sie if (list.contains (str)) {list.remove (str); ++ Count; }} return count; } private statische endgültige DateFormat Formatter = new SimpledateFormat ("yyyy-mm-dd"); private statische String [] Printday (Kalenderstart, Kalender -Endtag) {list <string> list = new ArrayList <string> (); // Wenn das angegebene Datum des Startdatums größer als das Enddatum ist, wird der Druck nicht durchgeführt, wenn (startday.comPareto (genday)> = 0) {neuer String zurückgeben [] {}; } // Das Datum jetzt gedruckt Calender CurrentPrintday = Startday; while (true) {// einem Datum zu CurrentPrintday.add (Calendar.Date, 1) hinzufügen; // Nachdem ein Datum hinzugefügt wurde, um festzustellen, ob das Enddatum erreicht ist, wird drucken, dass es beendet wird, wenn (currentPrintday.comPareto (Endday) == 0) {Break; } list.add (formatter.format (currentRintday.getTime ())); } String [] arr = list.toArray (neue String [0]); arr zurückgeben; }}Das Ausführungsergebnis in der Hauptmethode ist:
Es gibt Kommentare im Code und können bei Bedarf angepasst werden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.