Эта статья разделяет конкретный код для расчета Java рабочего времени, не включая праздники и выходные, для вашей ссылки. Конкретный контент заключается в следующем
пакет common.util; импортировать java.text.dateformat; импортировать java.text.parseexception; импортировать java.text.simpledateformat; импортировать java.util.arraylist; импортировать java.util.calendar; импортировать 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 = 0; // утренние рабочие часы, минута int pbh = 13; = 18; // рабочее время норнового рабочего времени, час int pem = 0; // NORNING Рабочее время, минута int pem = 0; // Норн float h2 = aeh+(float) aem/60; Float H3 = PBH+(Float) PBM/60; Float H4 = PEH+(float) PEM/60; Float Thourday = H2-H1+(H4-H3); // количество рабочего времени в день int dashpeek = 5; // Количество рабочих дней в неделю, длинное, milSecperday = 1000*60*60*24; // Количество миллисекундов в день поплавковые часы grespeek = часы дня*Daysperweek; // Количество в течение недели поплавковое расчеты. t1 = stringTodate (BetIntime); // Реальное время начала дата t2 = stringTodate (endtime); // Реальное время окончания // Предварительное обработку времени t1 = processbegintime (t1); T2 = ProcessEndTime (T2); // Если время начала будет позже, чем время окончания, верните 0 if (t1.gettime ()> t2.gettime ()) {return 0; } // Полное количество недель с начала времени до окончания времени int weedCount = (int) ((t2.gettime ()-t1.gettime ())/(milsecperday*7)); Float TotalHours = 0; TotalHours += WeekCount * TashPerweek; // Регулируют время окончания так, чтобы время начала и время окончания находились в течение недельного периода t2.settime (t2.gettime ()-WeekCount*7*MilSecperday); int daycounts = 0; // Запишите рабочий день между временем начала и временем окончания // Нарекомендовал время начала, чтобы время начала и время окончания были в тот же день или в течение смежных рабочих дней. 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 * часы дня; float hh1 = t1.gethours () + (float) t1.getminutes ()/60; float hh2 = t2.gethours () + (float) t2.getminutes ()/60; // начало и конец процесса в тот же день 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 {// начало и конец процесса не тот же день 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; } / ** * Время вывода формата: yyyy-mm-dd HH: MM: SS Week x * @param t * @return * / private String printdate (date t) {String Str; String xingqi = null; Switch (t.getDay ()) {case 0: xingqi = "Sunday"; перерыв; Случай 1: xingqi = "понедельник"; перерыв; Случай 2: xingqi = "вторник"; перерыв; Случай 3: xingqi = "Среда"; перерыв; Случай 4: xingqi = "четверг"; перерыв; Случай 5: xingqi = "пятница"; перерыв; Случай 6: xingqi = "суббота"; перерыв; по умолчанию: перерыв; } str = format.format (t)+""+xingqi; вернуть Str; }/** * Предварительно обработать время окончания, так что он находился в рабочем периоде в течение рабочего дня * @param t * @return */private date processendtime (date t) {float h = t.gethours () + (float) t.getminutes ()/60; // Если время окончания будет позднее, чем днем в нерабочее время, установите его на дневной вне часа if (h> = h4) {t.sethours (peh); t.setminutes (pem); } else {// Если время окончания находится между днем вне часов, установите его на утро вне часа if (h> = h2 && h <= h3) {t.sethours (aeh); T.SetMinutes (AEM); } else {// Если время окончания ранее, чем утреннее вне дома, однажды выдвиньте дату вперед и установите время до полудня вне часа if (t.gethours () <= h1) {t.settime (t.gettime ()-milsecperday); T.Sethours (PEH); t.setminutes (pem); }}} // Если время окончания уик-энд, то время окончания будет направлено в послеобеденный в нерабочее время самого последнего рабочего дня 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; }/** * Предварительная обработка времени начала * @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.SetMinutes (ABM); } else {// Если время начала находится между обеденным перерывом, то установите на дневное рабочее время, если (h> = h2 && h <= h3) {t.sethours (pbh); t.setminutes (pbm); } else {// Если время начала ранее, чем утреннее рабочее время, установите час в утреннее рабочее время, если (t.gethours () <= h1) {t.sethours (abh); T.SetMinutes (ABM); }}} // Если время начала составляет выходные, затем перенесите время начала в утреннее рабочее время самого последнего рабочего дня 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; } / ** * Время преобразовать время в форме строки в форму даты * @param time * @return * / private date stringtodate (string time) {try {return format.parse (time); } catch (parseexception e) {e.printstacktrace (); вернуть ноль; }} / ** * Удалить выходные и праздничные работы. float a = CH.Calculatehours (Betrintime, Endutime); Календарь startDay = calendar.getInstance (); Календарь Endday = Calendar.getInstance (); startDay.settime (formatter.parse (Betrintime)); 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"}; Календарь сейчас = Calendar.getInstance (); int Год = теперь.get (calendar.year); // Получить список текущего года <String> list = new ArrayList <String> (); for (String String: Holiday) {string = Год+"-"+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; Поплавок рабочий дом = b-holidayhous; Возвращение рабочего дома; } public static void main (string [] args) бросает parseexception {string bomintime = "2018-6-1 9:00:00"; String EndTime = "2018-6-4 10:10:00"; Расчеты ch = new ClountHourshours (); float b = CH.Calculatehours (Betrintime, EndTime); System.out.println (b); float a = Countulatehours.calculatehour (Betrintime, 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> (); Для (String Str: arr1) {// Обработка первого массива значения в списке - 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} for (string str: arr2) {// Если второй массив имеет то же значение, что и первый массив, delete if (list.contains (str)) {list.remove (str); ++ подсчет; }} return count; } частная статическая окончательная формат Formatter = new SimpleDateFormat ("yyyy-mm-dd"); Private Static String [] printday (Calendar Startday, Calendar Endday) {list <string> list = new ArrayList <string> (); // Если дата даты даты даты больше, чем дата окончания, Print не будет выполнена, если (startDay.compareto (andDay)> = 0) {return new String [] {}; } // дата, напечатанная теперь календарь currentprintday = startDay; while (true) {// добавить одну дату в currentprintday.add (calendar.date, 1); // После добавления одной даты, чтобы определить, достигнута ли дата окончания, распечатать ее будет прекращено, если (currentprintday.compareto (окончательный день) == 0) {break; } list.add (formatter.format (currentprintday.gettime ())); } String [] arr = list.toarray (new String [0]); возврат Arr; }}Результат выполнения в основном методе:
В коде есть комментарии и могут быть скорректированы по мере необходимости.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.