Cet article partage le code spécifique pour le calcul Java des heures de travail, sans compter les vacances et les week-ends, pour votre référence. Le contenu spécifique est le suivant
package commun.util; import java.text.dateformat; import java.text.parseException; import java.text.simpledateFormat; import java.util.arraylist; import java.util.calendar; Importer java.util.date; import java.util.linkedlist; Importer java.util.list; classe publique CalculateHours {SimpledateFormat format = new SimpledateFormat ("Yyyy-mm-dd HH: mm: ss"); // Le format ici peut être défini par vous-même // définir les heures de travail: l'heure peut être ajustée en fonction de la situation réelle int ABH = 9; // heures de travail du matin, heure int ABM = 00; // HEURES DE TRAVAIL, MINUTE INT AEH = 12; // HEURES DE TRAVAIL MATIN, HEURS INT AEM = 0; // Morning Hours de travail, Minute int pbh = 13; 18; // Norning Heures de travail, heure int pem = 0; // Norning Heures de travail, minute int pem = 0; // Norning HEURES de travail, Float minute 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); // Nombre d'heures de travail par jour Int DaysPerweek = 5; // Nombre de jours ouvrables par semaine Milsecperday = 1000 * 60 * 60 * 24; // Nombre de millisecondes par jour Float HoursPerweek t1 = stringTodate (begintime); // Date d'heure de début réelle t2 = stringTodate (Fintime); // Temps de fin réel // Prétrange de l'heure t1 = processBegIntime (t1); t2 = processEndTime (t2); // Si l'heure de début est ultérieure que l'heure de fin, retournez 0 if (t1.gettime ()> t2.getTime ()) {return 0; } // Le nombre complet de semaines entre l'heure de début à l'heure de fin int semaine = (int) ((t2.GetTime () - t1.getTime ()) / (milSecperday * 7)); float totalhours = 0; TotalHours + = WeekCount * HoursPerweek; // ajustez l'heure de fin afin que l'heure de début et la fin se situent dans une période d'une semaine t2.setTime (t2.GetTime () - WeekCount * 7 * milSecperday); int dayCounts = 0; // enregistrer la journée de travail entre l'heure de début et l'heure de fin // ajustez l'heure de début afin que l'heure de début et l'heure de fin soient le même jour, ou dans les jours ouvrables adjacents. 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; // Le processus de début et de fin est le même jour 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 {// Le processus de début et de fin n'est pas le float le même jour TT1 = H4 - HH1; float tt2 = hh2 - h1; if (hh1 <= h2) {tt1 = tt1 - (h3-h2); } if (hh2> = h3) {tt2 = tt2 - (h3-h2); } TotalHours + = (TT1 + TT2); } Retour totalhours; } / ** * Temps de sortie du format: yyyy-mm-dd hh: mm: semaine ss x * @param t * @return * / private String printdate (date t) {String str; String xingqi = null; switch (t.getDay ()) {cas 0: xingqi = "dimanche"; casser; Cas 1: xingqi = "lundi"; casser; Cas 2: xingqi = "mardi"; casser; Cas 3: xingqi = "mercredi"; casser; Cas 4: xingqi = "jeudi"; casser; Cas 5: xingqi = "vendredi"; casser; Cas 6: xingqi = "Saturday"; casser; par défaut: pause; } str = format.format (t) + "" + xingqi; retour STR; } / ** * Prétraitez l'heure de fin afin qu'elle soit dans la période de travail dans le jour de travail * @param t * @return * / date private processEndTime (date t) {float h = t.Gethours () + (float) t.getMinutes () / 60; // Si l'heure de fin est plus tard que l'après-midi en dehors des heures, définissez-la sur l'après-midi en dehors des heures if (h> = h4) {T.Sethours (peh); t.setMinutes (PEM); } else {// Si l'heure de fin se situe entre l'après-midi en dehors des heures, définissez-la sur le matin hors heures if (h> = h2 && h <= h3) {t.sethours (aeh); T.SetMinutes (AEM); } else {// Si l'heure de fin est plus tôt que le matin en dehors des heures, poussez la date en avant un jour et définissez l'heure sur l'après-midi en dehors des heures si (t.Gethours () <= H1) {t.SetTime (t.getTime () - milSecperday); T.Sethours (PEH); t.setMinutes (PEM); }}} // Si l'heure de fin est un week-end, alors l'heure de fin sera transmise à l'après-midi après les heures du jour de travail le plus récent 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); } if (t.getDay () == 6) {t.SetTime (t.getTime () - milSecperday * (t.getDay () == 6? 1: 2)); T.Sethours (PEH); t.setMinutes (PEM); } return t; } / ** * Prétraitement de l'heure de début * @param t1 * @return * / Date privilège ProcessBegintime (date t) {float h = t.Gethours () + (float) t.getMinutes () / 60; // Si l'heure de début est plus tard que l'après-midi, obtenez le temps de travail, repoussez l'heure de début un jour si (h> = h4) {t.settime (t.gettime () + milsecperday); T.Sethours (ABH); t.setMinutes (ABM); } else {// Si l'heure de début est entre la pause déjeuner, alors réglé sur l'heure de travail de l'après-midi if (h> = h2 && h <= h3) {t.sethours (pbh); T.SetMinutes (PBM); } else {// Si l'heure de début est plus tôt que le matin, le matin, définissez l'heure de travail du matin if (t.Gethours () <= H1) {T.Sethours (ABH); t.setMinutes (ABM); }}} // Si l'heure de début est un week-end, passez l'heure de début à l'heure de travail du matin du jour ouvrable le plus récent 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; } / ** * Il est temps de convertir l'heure sous la forme d'une chaîne en la forme d'une date * @param Heure * @return * / private Date StringTodate (String time) {try {return format.parse (heure); } catch (parseException e) {e.printStackTrace (); retourner null; }} / ** * Supprimer les week-ends et les jours fériés heures de travail * @param begintime * @param endtime * @return * @throws parseException * / public static float calculhour (String begintime, string end time) lève ParseException {calculHours ch = new CalculateHours (); float a = ch.calculateHours (début, fin); Calendar StopDay = calendar.getInstance (); Calendar Endday = calendar.getInstance (); startday.settime (formatter.parse (begintime)); finday.settime (formatter.parse (endtime)); String [] Workday = Printday (à l'étranger, Finday); 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 maintenant = calendar.getInstance (); int an year = now.get (calendar.year); // Obtenez la liste de l'année en cours <string> list = new ArrayList <string> (); pour (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; retourner des travaux de travail; } public static void main (String [] args) lève 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 (début, fin); System.out.println (b); float a = calculHours.CalculateHour (début, end, endure); System.out.println (a); } / ** * Supprimez la même date dans le tableau * @param arr1 * @param arr2 * @return * / private static int arrcontrast (string [] arr1, string [] arr2) {int count = 0; List <string> list = new LinkedList <string> (); pour (String Str: Arr1) {// Traitement du premier tableau, les valeurs dans la liste sont 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} pour (String str: arr2) {// Si le deuxième tableau a la même valeur que le premier tableau, supprimez if (list.contains (str)) {list.remove (str); ++ count; }} Return Count; } Private Static Final DateFormat Formatter = new SimpledateFormat ("Yyyy-mm-dd"); String statique privé [] printday (Calendar Stopday, Calendar Endday) {list <string> list = new ArrayList <string> (); // Si la date de début de la date donnée est supérieure à la date de fin, l'impression ne sera pas effectuée si (startday ..comPareto (Finday)> = 0) {return new String [] {}; } // La date imprimée est désormais calendrier CurrentPrintDay = à l'étranger; while (true) {// ajouter une date à currentprintday.add (calendar.date, 1); // Après avoir ajouté une date pour déterminer si la date de fin est atteinte, l'imprimez-le si (currentprintday.compareto (Finday) == 0) {Break; } list.add (formatter.format (currentprintday.getTime ())); } String [] arr = list.toArray (new String [0]); retour arr; }}Le résultat de l'exécution dans la méthode principale est:
Il y a des commentaires dans le code et peut être ajusté au besoin.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.