บทความนี้แบ่งปันรหัสเฉพาะสำหรับการคำนวณ 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; คลาสสาธารณะ calculateHours {simpledateFormat format = new SimpledateFormat ("YYYY-MM-DD HH: MM: SS"); // รูปแบบที่นี่สามารถตั้งค่าได้ด้วยตัวเอง // กำหนดเวลาทำงาน: เวลาสามารถปรับได้ตามสถานการณ์จริง int abh = 9; // ชั่วโมงทำงานตอนเช้า, ชั่วโมง int abm = 00; // ชั่วโมงทำงานตอนเช้า, นาที int aeh = 12; // ชั่วโมงทำงานตอนเช้า, ชั่วโมง int aem = 0; 18; // ชั่วโมงทำงาน norning, ชั่วโมง int pem = 0; // ชั่วโมงทำงาน norning, นาที int pem = 0; // ชั่วโมงทำงาน norning, นาทีลอย h1 = abh+(ลอย) abm/60; ลอย H2 = AEH+(ลอย) AEM/60; Float H3 = PBH+(ลอย) PBM/60; ลอย H4 = PEH+(ลอย) PEM/60; Float Hours Perday = H2-H1+(H4-H3); // จำนวนชั่วโมงทำงานต่อวัน int daysperweek = 5; // จำนวนวันทำการต่อสัปดาห์ยาว milsecperday = 1,000*60*60*24; // จำนวนมิลลิวินาทีต่อวัน วันที่เวลาสตริง t1 = stringTodate (begintime); // เวลาเริ่มต้นจริงวันที่ t2 = stringtodate (endtime); // เวลาสิ้นสุดจริง // ล่วงหน้าล่วงหน้าเวลา t1 = processBegintime (t1); t2 = processEndTime (t2); // หากเวลาเริ่มต้นช้ากว่าเวลาสิ้นสุดให้ส่งคืน 0 ถ้า (t1.getTime ()> t2.getTime ()) {return 0; } // จำนวนสัปดาห์เต็มตั้งแต่เวลาเริ่มต้นจนถึงเวลาสิ้นสุด int weekCount = (int) ((t2.getTime ()-t1.getTime ())/(milsecperday*7)); Float TotalHours = 0; TotalHours += WeekCount * Hoursperweek; // ปรับเวลาสิ้นสุดเพื่อให้เวลาและเวลาเริ่มต้นอยู่ในช่วงเวลาหนึ่งสัปดาห์ t2.settime (t2.getTime ()-WeekCount*7*milsecperday); int dayCounts = 0; // บันทึกวันทำงานระหว่างเวลาเริ่มต้นและเวลาสิ้นสุด // ปรับเวลาเริ่มต้นเพื่อให้เวลาและเวลาเริ่มต้นอยู่ในวันเดียวกันหรือภายในวันทำงานที่อยู่ติดกัน ในขณะที่ (t1.getTime () <= t2.getTime ()) {วันที่อุณหภูมิ = วันที่ใหม่ (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 () + (ลอย) t1.getMinutes ()/60; float hh2 = t2.getHours () + (ลอย) t2.getMinutes ()/60; // กระบวนการเริ่มต้นและสิ้นสุดเป็นวันเดียวกันถ้า (t1.getday () == t2.getday ()) {float tt = 0; TT = HH2 - HH1; if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt - (h3 -h2); } TotalHours += tt; } else {// กระบวนการเริ่มต้นและสิ้นสุดไม่ใช่วันเดียวกันลอย tt1 = h4 - hh1; ลอย 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 สัปดาห์ x * @param t * @return * / สตริงส่วนตัว printdate (วันที่ t) {String str; สตริง xingqi = null; switch (t.getday ()) {กรณี 0: xingqi = "วันอาทิตย์"; หยุดพัก; กรณีที่ 1: xingqi = "วันจันทร์"; หยุดพัก; กรณีที่ 2: xingqi = "วันอังคาร"; หยุดพัก; กรณีที่ 3: xingqi = "วันพุธ"; หยุดพัก; กรณีที่ 4: xingqi = "วันพฤหัสบดี"; หยุดพัก; กรณีที่ 5: xingqi = "วันศุกร์"; หยุดพัก; กรณีที่ 6: xingqi = "วันเสาร์"; หยุดพัก; ค่าเริ่มต้น: break; } str = format.format (t)+""+xingqi; return str; }/** * ประมวลผลล่วงหน้าเวลาสิ้นสุดเพื่อให้ภายในระยะเวลาทำงานภายในวันทำการ * @param t * @return */วันที่ส่วนตัว processendtime (วันที่ t) {float h = t.getHours () + (ลอย) t.getMinutes ()/60; // ถ้าเวลาสิ้นสุดจะช้ากว่าช่วงบ่ายให้ตั้งค่าเป็นช่วงบ่ายถ้า (h> = h4) {t.sethours (peh); T.SetMinutes (PEM); } else {// ถ้าเวลาสิ้นสุดอยู่ระหว่างช่วงบ่ายให้ตั้งค่าเป็นตอนเช้าถ้า (h> = h2 && h <= h3) {t.sethours (aeh); T.SetMinutes (AEM); } else {// ถ้าเวลาสิ้นสุดเร็วกว่าเช้าตรู่ตอนเช้าให้ส่งวันที่ไปข้างหน้าหนึ่งวันและตั้งเวลาเป็นช่วงบ่ายนอกเวลาถ้า (t.getHours () <= h1) {t.settime (t.gettime ()-milsecperday); T.Sethours (PEH); T.SetMinutes (PEM); }}} // ถ้าเวลาสิ้นสุดคือวันหยุดสุดสัปดาห์แล้วเวลาสิ้นสุดจะถูกส่งต่อไปยังช่วงบ่ายหลังเวลาทำการของวันทำการล่าสุดถ้า (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 */วันที่ส่วนตัวกระบวนการ begintime (วันที่ t) {float h = t.getHours () + (ลอย) 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); }}} // หากเวลาเริ่มต้นเป็นวันหยุดสุดสัปดาห์จากนั้นย้ายเวลาเริ่มต้นกลับไปยังเวลาทำงานตอนเช้าของวันทำการล่าสุดถ้า (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 เวลา * @return * / สตริงวันที่ส่วนตัว (เวลาสตริง) {ลอง {return format.parse (เวลา); } catch (parseexception e) {e.printstacktrace (); คืนค่า null; }} / ** * ลบวันหยุดสุดสัปดาห์และวันหยุดเวลาทำงาน * @param begintime * @param Endtime * @return * @throws parseexception * / public Static Float calculateHour (String Begintime float a = ch.calculatehours (Begintime, endtime); ปฏิทิน startDay = calendar.getInstance (); ปฏิทิน endday = calendar.getInstance (); startDay.Settime (formatter.parse (Begintime)); endday.settime (formatter.parse (endtime)); String [] workday = printday (start -day, endday); สตริง [] วันหยุด = สตริงใหม่ [] {"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 year = now.get (calendar.year); // รับรายการปีปัจจุบัน <string> list = new ArrayList <String> (); สำหรับ (สตริงสตริง: วันหยุด) {string = year+"-"+สตริง; list.add (สตริง); } string [] arr = list.toarray (สตริงใหม่ [0]); int วันหยุด = arrContrast (วันทำงาน, arr); int holidayhous = วันหยุด*8; float b = (float) (math.round (a*10))/10; float workhours = b-holidayhous; กลับไปทำงาน; } โมฆะคงที่สาธารณะหลัก (String [] args) พ่น 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 (Begintime, endtime); System.out.println (b); float a = calculatehours.calculatehour (Begintime, endtime); System.out.println (a); } / ** * ลบวันที่เดียวกันในอาร์เรย์ * @param arr1 * @param arr2 * @return * / private static int arrcontrast (สตริง [] arr1, string [] arr2) {int count = 0; รายการ <string> list = new LinkedList <String> (); สำหรับ (String str: arr1) {// การประมวลผลอาร์เรย์แรกค่าในรายการคือ 1, 2, 3, 4 ถ้า (! list.contains (str)) {list.add (str); }} สำหรับ (String str: arr2) {// ถ้าอาร์เรย์ที่สองมีค่าเท่ากับอาร์เรย์แรกลบถ้า (list.contains (str)) {list.remove (str); ++ นับ; }} นับคืน; } private static dateformat formatter = new SimpledateFormat ("yyyy-mm-dd"); สตริงคงที่ส่วนตัว [] printday (ปฏิทิน startday, ปฏิทิน endday) {list <string> list = new ArrayList <String> (); // หากวันที่เริ่มต้นวันที่ที่กำหนดมีขนาดใหญ่กว่าวันที่สิ้นสุดการพิมพ์จะไม่ดำเนินการถ้า (startDay.Compareto (endday)> = 0) {ส่งคืนสตริงใหม่ [] {}; } // วันที่พิมพ์ตอนนี้ปฏิทิน CurrentPrintday = StartDay; ในขณะที่ (จริง) {// เพิ่มวันที่หนึ่งใน currentprintday.add (calendar.date, 1); // หลังจากเพิ่มวันที่หนึ่งเพื่อตรวจสอบว่าวันที่สิ้นสุดจะมาถึงแล้วให้พิมพ์จะถูกยกเลิกหาก (currentPrintday.Compareto (endday) == 0) {break; } list.add (formatter.format (currentprintday.gettime ())); } string [] arr = list.toarray (สตริงใหม่ [0]); กลับ arr; -ผลการดำเนินการในวิธีหลักคือ:
มีความคิดเห็นในรหัสและสามารถปรับได้ตามต้องการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น