تشارك هذه المقالة رمزًا محددًا لحساب Java لساعات العمل ، بما في ذلك الإجازات وعطلات نهاية الأسبوع ، للرجوع إليها. المحتوى المحدد كما يلي
حزمة شائعة. استيراد java.text.dateformat ؛ استيراد java.text.parseException ؛ استيراد java.text.simpledateformat ؛ استيراد java.util.arraylist ؛ استيراد java.util.calendar ؛ استيراد java.util.date ؛ استيراد java.util.linkedList ؛ استيراد java.util.list ؛ الفئة العامة حساب Hours {SimpleDateFormat Format = new SimplEdateFormat ("YyyyM-MM-DD HH: MM: SS") ؛ // يمكن تعيين التنسيق هنا من قبل نفسك // تعيين ساعات العمل: يمكن ضبط الوقت وفقًا للوضع الفعلي int abh = 9 ؛ // ساعات العمل الصباحية ، الساعة int abm = 00 ؛ // ساعات العمل الصباحية ، دقيقة int aeh = 12 ؛ ١٨ ؛ تعويم H2 = AEH+(تعويم) AEM/60 ؛ Float H3 = PBH+(float) PBM/60 ؛ Float H4 = PEH+(float) PEM/60 ؛ تعويم ساعات العمل = H2-H1+(H4-H3) ؛ // عدد ساعات العمل في اليوم الواحد int dayperweek = 5 ؛ // عدد أيام العمل في الأسبوع الطويل milsecperday = 1000*60*60*24 ؛ تاريخ الوقت t1 = stringTodate (begintime) ؛ // تاريخ البدء الحقيقي تاريخ t2 = stringTodate (endtime) ؛ // end end time // preprocess time t1 = processBegintime (t1) ؛ T2 = ProcessEndTime (T2) ؛ // إذا كان وقت البدء متأخراً عن وقت الانتهاء ، فأرد 0 إذا (t1.getTime ()> t2.getTime ()) {return 0 ؛ } // العدد الكامل من الأسابيع من وقت البدء إلى وقت الانتهاء int weekcount = (int) ((t2.getTime ()-t1.gettime ())/(milsecperday*7)) ؛ تعويم TotalHours = 0 ؛ TotalHours += WeekCount * Housperweek ؛ . int daycounts = 0 ؛ // سجل يوم العمل بين وقت البدء ووقت الانتهاء // اضبط وقت البدء بحيث يكون وقت البدء ووقت الانتهاء في نفس اليوم ، أو في غضون أيام العمل المجاورة. بينما (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 ؛ } آخر {t1 = temp ؛ Daycounts ++ ؛ }} TotalHours += DayCounts * Hoursperday ؛ float hh1 = t1.gethours () + (float) t1.getMinutes ()/60 ؛ float hh2 = t2.gethours () + (float) t2.getMinutes ()/60 ؛ . TT = HH2 - HH1 ؛ if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt - (h3 -h2) ؛ } TotalHours += tt ؛ } آخر {// بداية العملية والنهاية ليست في نفس اليوم 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) ؛ } إرجاع TotalHours ؛ } / ** * تنسيق وقت الإخراج: yyyy-mm-dd hh: mm: ss week x * param t * @return * / private string printdate (date t) {String str ؛ سلسلة xingqi = فارغة ؛ Switch (t.getDay ()) {case 0: xingqi = "Sunday" ؛ استراحة؛ الحالة 1: xingqi = "الاثنين" ؛ استراحة؛ الحالة 2: xingqi = "الثلاثاء" ؛ استراحة؛ الحالة 3: xingqi = "الأربعاء" ؛ استراحة؛ الحالة 4: xingqi = "الخميس" ؛ استراحة؛ الحالة 5: xingqi = "الجمعة" ؛ استراحة؛ الحالة 6: xingqi = "السبت" ؛ استراحة؛ الافتراضي: استراحة ؛ } str = format.format (t)+""+xingqi ؛ إرجاع شارع }/** * المعالجة المسبقة في وقت الانتهاء بحيث يكون خلال فترة العمل خلال يوم العمل * param t * @return */Private Date ProcessEndTime (date t) {float h = t.gethours () + (float) t.getMinutes ()/60 ؛ // إذا كان وقت الانتهاء في وقت لاحق من فترة ما بعد الظهر ، فقم بتعيينه على بعد الظهر خارج ساعة إذا (h> = h4) {t.sethours (peh) ؛ T.SetMinutes (PEM) ؛ } آخر {// إذا كان وقت الانتهاء بين فترة ما بعد الظهر ، فقم بتعيينه على صباح الإطار في الساعة إذا (h> = h2 && h <= h3) {t.sethours (aeh) ؛ T.SetMinutes (AEM) ؛ } آخر {// إذا كان وقت الانتهاء في وقت مبكر من الصباح خارج الساعة ، وادفع التاريخ للأمام يومًا ما ، وقم بتعيين الوقت بعد الظهر خارج ساعة إذا (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: 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) ؛ } إرجاع t ؛ }/** * المعالجة المسبقة لوقت البدء * param t1 * @return */private date processBegintime (date t) {float h = t.gethours () + (float) t.getMinutes ()/60 ؛ // إذا كان وقت البدء في وقت متأخر من فترة ما بعد الظهر خارج وقت العمل ، فدفع وقت البدء مرة واحدة في يوم من الأيام إذا (h> = h4) {t.settime (t.getTime ()+milsecperday) ؛ T.Sethours (ABH) ؛ T.SetMinutes (ABM) ؛ } آخر {// إذا كان وقت البدء بين استراحة الغداء ، ثم انطلق إلى وقت العمل بعد الظهر إذا (h> = h2 && h <= h3) {t.sethours (pBH) ؛ T.SetMinutes (PBM) ؛ } آخر {// إذا كان وقت البدء في وقت مبكر من وقت العمل الصباحي ، فقم بتعيين ساعة إلى الصباح إذا (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) ؛ } إرجاع t ؛ } / ** * حان الوقت لتحويل الوقت في شكل سلسلة إلى نموذج تاريخ * param time * return * / private date stringTodate (وقت السلسلة) {try {return format.parse (time) ؛ } catch (parseException e) {E.PrintStackTrace () ؛ العودة لاغية. }} / ** * إزالة عطلات نهاية الأسبوع والأعياد ساعات العمل * param begintime * param endtime * return * throws parseException * / public static float calcutionHour (سلسلة begintime ، endtime string) يلقي parseException {calcutionHours ch = new Accounturs () ؛ float a = ch.calculateHours (begintime ، endtime) ؛ التقويم البدء = calendar.getInstance () ؛ التقويم النهائي = calendar.getInstance () ؛ start Day.Settime (formatter.parse (begintime)) ؛ endday.settime (formatter.parse (Endtime)) ؛ String [] Workday = printday (start day ، enday) ؛ 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 year = now.get (calendar.year) ؛ // احصل على قائمة السنة الحالية <string> list = new ArrayList <Tring> () ؛ لـ (سلسلة السلسلة: عطلة) {string = year+"-"+string ؛ list.add (سلسلة) ؛ } string [] arr = list.toarray (سلسلة جديدة [0]) ؛ int intors = arrcontrast (يوم العمل ، arr) ؛ int HolidayHous = Holidays*8 ؛ تعويم B = (تعويم) (Math.round (A*10))/10 ؛ تعويم العمل = B-Holidayhous ؛ إرجاع العمل. } static void main (string [] args) يلقي ParseException {String begintime = "2018-6-1 9:00:00" ؛ String endtime = "2018-6-4 10:10:00" ؛ حساب ch = new calculateHours () ؛ float b = ch.calculateHours (begintime ، endtime) ؛ system.out.println (b) ؛ float a = calcutionHours.CalculateHour (begintime ، endtime) ؛ system.out.println (a) ؛ } / ** * قم بإزالة نفس التاريخ في Array * param arr1 * param arr2 * @return * / private static int arrcontrast (string [] arr1 ، string [] arr2) {int count = 0 ؛ قائمة <Tring> list = new LinkedList <String> () ؛ لـ (string str: arr1) {// معالجة الصفيف الأول ، تكون القيم في القائمة 1 ، 2 ، 3 ، 4 if (! list.contains (str)) {list.add (str) ؛ }} لـ (string str: arr2) {// إذا كان الصفيف الثاني له نفس القيمة مثل الصفيف الأول ، حذف if (list.contains (str)) {list.remove (str) ؛ ++ العد ؛ }} عدد الإرجاع ؛ } formfortformat static Final Formatter = new SimplEdateFormat ("Yyyy-MM-DD") ؛ سلسلة ثابتة خاصة [] printday (يوم بدء التقويم ، يوم الانتهاء التقويم) {list <string> list = new ArrayList <string> () ؛ // إذا كان تاريخ بدء التاريخ المحدد أكبر من تاريخ الانتهاء ، فلن يتم تنفيذ الطباعة إذا (startday.compareto (نهاية اليوم)> = 0) {return new string [] {} ؛ } // التاريخ المطبوع الآن التقويم CurrentPrintday = start Day ؛ بينما (صحيح) {// أضف تاريخًا واحدًا إلى currentPrintDay.add (Calendar.date ، 1) ؛ // بعد إضافة تاريخ واحد لتحديد ما إذا كان يتم الوصول إلى تاريخ الانتهاء ، سيتم طباعته إذا (CurrentPrintDay.compareto (endday) == 0) {break ؛ } list.add (formatter.format (currentPrintDay.getTime ())) ؛ } string [] arr = list.toarray (سلسلة جديدة [0]) ؛ إرجاع arr ؛ }}يؤدي التنفيذ إلى الطريقة الرئيسية هي:
هناك تعليقات في الكود ويمكن تعديلها حسب الحاجة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.