Artikel ini membagikan kode spesifik untuk perhitungan Java jam kerja, tidak termasuk liburan dan akhir pekan, untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
Paket Common.util; impor java.text.dateFormat; impor java.text.parseexception; impor java.text.simpledateFormat; impor java.util.arraylist; impor java.util.calendar; impor java.util.date; impor java.util.linkedlist; impor java.util.list; kelas publik CalculateHours {SimpleDateFormat format = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); // Format di sini dapat ditetapkan sendiri // mengatur jam kerja: Waktu dapat disesuaikan sesuai dengan situasi aktual int abh = 9; // jam kerja pagi, jam int abm = 00; // jam kerja pagi, menit int aeh = 12; // jam kerja pagi, jam kerja = 0; // jam kerja pagi, menit int pbh = 13; // jam kerja non -jam, jam kerja non -mm, jam kerja, jam kerja, jam kerja, jam kerja, 18; // jam kerja norning, jam int pem = 0; // jam kerja norning, menit int pem = 0; // jam kerja norning, menit float 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); // Jumlah jam kerja per hari int Daysweek = 5; // Jumlah hari kerja per minggu milsecperday = 1000*60*60*24; // Jumlah milidetik per hari. Tanggal T1 = StringTodate (BegInime); // Tanggal Waktu Mulai Nyata T2 = StringTodate (endtime); // Waktu akhir nyata // Preprocess Time T1 = ProcessBeginTime (T1); T2 = ProcessEndTime (T2); // Jika waktu mulai lebih lambat dari waktu akhir, kembalikan 0 if (t1.getTime ()> t2.getTime ()) {return 0; } // Jumlah penuh minggu dari waktu mulai hingga waktu akhir int weekcount = (int) ((t2.getTime ()-t1.getTime ())/(milsecperday*7)); float totalhours = 0; TotalHours += Weekcount * Hoursperweek; // Sesuaikan waktu akhir sehingga waktu mulai dan waktu akhir berada dalam periode satu minggu t2.settime (t2.getTime ()-Weekcount*7*Milsecperday); int daycounts = 0; // Catat hari kerja antara waktu mulai dan waktu akhir // sesuaikan waktu mulai sehingga waktu mulai dan waktu akhir pada hari yang sama, atau dalam hari kerja yang berdekatan. while (t1.getTime () <= t2.getTime ()) {date temp = tanggal baru (t1.getTime ()+milsecperday); temp = processBeginTime (temp); temp.setHours (t1.getHours ()); temp.setMinutes (t1.getMinutes ()); if (temp.getTime ()> t2.getTime ()) {break; } else {t1 = temp; daycount ++; }} TotalHours += Daycounts * Hoursperday; float hh1 = t1.getHours () + (float) t1.getMinutes ()/60; float hh2 = t2.getHours () + (float) t2.getMinutes ()/60; // proses mulai dan akhir adalah hari yang sama jika (t1.getday () == t2.getday ()) {float tt = 0; TT = HH2 - HH1; if (hh1> = h1 && hh1 <= h2 && hh2> = h3) {tt = tt - (h3 -h2); } TotalHours += TT; } else {// proses mulai dan akhir tidak pada hari yang sama mengapung 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; } / ** * Format waktu output: yyyy-mm-dd hh: mm: ss minggu x * @param t * @return * / private string printDate (date t) {string str string; String xingqi = null; switch (t.getday ()) {case 0: xingqi = "sunday"; merusak; Kasus 1: xingqi = "Senin"; merusak; Kasus 2: xingqi = "Selasa"; merusak; Kasus 3: xingqi = "Rabu"; merusak; Kasus 4: xingqi = "Kamis"; merusak; Kasus 5: xingqi = "Friday"; merusak; Kasus 6: xingqi = "Sabtu"; merusak; default: break; } str = format.format (t)+""+xingqi; mengembalikan str; }/** * preprocess pada waktu akhir sehingga berada dalam periode kerja dalam hari kerja * @param t * @return */private date processEndtime (tanggal t) {float h = t.getHours () + (float) t.getMinutes ()/60; // Jika akhir waktu lebih lambat dari sore hari, atur ke sore hari jika (h> = h4) {t.setHours (peh); T.SetMinutes (PEM); } else {// Jika waktu akhir adalah antara sore hari, atur ke pagi hari if (h> = h2 && h <= h3) {t.setHours (aeh); T.SetMinutes (AEM); } else {// Jika waktu akhir lebih awal dari pagi hari, dorong tanggal ke depan suatu hari, dan atur waktu ke sore hari jika (t.getHours () <= h1) {t.setTime (t.getTime ()-milsecperday); T.SetHours (PEH); T.SetMinutes (PEM); }}} // Jika waktu akhirnya adalah akhir pekan, maka waktu akhirnya akan diteruskan ke sore hari setelah jam kerja terbaru jika (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; }/** * preprocessing waktu mulai * @param t1 * @return */private Date ProcessBeginTime (Tanggal t) {float h = t.getHours () + (float) t.getMinutes ()/60; // Jika waktu mulai lebih lambat dari waktu kerja yang tidak dihitung, dorong waktu mulai suatu hari nanti jika (h> = h4) {t.setTime (t.getTime ()+milsecperday); T.SetHours (ABH); T.SetMinutes (ABM); } else {// Jika waktu mulai antara istirahat makan siang, lalu atur ke waktu kerja sore jika (h> = h2 && h <= h3) {t.setHours (pbh); T.SetMinutes (PBM); } else {// Jika waktu mulai lebih awal dari waktu kerja pagi, set jam kerja jam ke pagi jika (t.getHours () <= h1) {t.setHours (abh); T.SetMinutes (ABM); }}} // Jika waktu mulai adalah akhir pekan, maka pindahkan waktu mulai kembali ke waktu kerja pagi hari kerja terbaru jika (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; } / ** * Waktu untuk mengonversi waktu dalam bentuk string ke bentuk tanggal * @param waktu * @return * / private date stringTodate (waktu string) {coba {return format.parse (waktu); } catch (parseException e) {e.printstacktrace (); kembali nol; }} / ** * Hapus akhir pekan dan liburan jam kerja * @param begintime * @param endtime * @return * @throws parseException * / public static float calculateHour (string begintime, string endtime) melempar parseException {calculateHours ch = new calculateHours (); float a = ch.calculateHours (beginTime, endtime); Calendar Startday = Calendar.getInstance (); Kalender Endday = Calendar.getInstance (); startday.settime (formatter.parse (beginTime)); endday.settime (formatter.parse (endtime)); String [] workday = printay (startday, endday); String [] holiday = string baru [] {"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 sekarang = calendar.getInstance (); int tahun = now.get (calendar.year); // Dapatkan daftar tahun berjalan <string> Daftar = ArrayList baru <string> (); untuk (string string: holiday) {string = tahun+"-"+string; list.add (string); } String [] arr = list.toArray (string baru [0]); int holiday = arrcontrast (workday, arr); int holidayhous = liburan*8; float b = (float) (math.round (a*10))/10; workhours float = b-holidayhous; mengembalikan workhours; } public static void main (string [] args) melempar 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); } / ** * Hapus tanggal yang sama di array * @param arr1 * @param arr2 * @return * / private static int arrcontrast (string [] arr1, string [] arr2) {int count = 0; Daftar <String> Daftar = LinkedList baru <string> (); untuk (string str: arr1) {// memproses array pertama, nilai dalam daftar adalah 1, 2, 3, 4 if (! list.contains (str)) {list.add (str); }} untuk (string str: arr2) {// Jika array kedua memiliki nilai yang sama dengan array pertama, hapus if (list.contains (str)) {list.remove (str); ++ Count; }} return count; } private static final dateFormat formatter = new SimpleDateFormat ("yyyy-mm-dd"); Private Static String [] printay (Calendar Startday, Calendar Endday) {Daftar <String> Daftar = ArrayList baru <String> (); // Jika tanggal mulai tanggal yang diberikan lebih besar dari tanggal akhir, cetak tidak akan dilakukan jika (startday.comppareto (endday)> = 0) {return string baru [] {}; } // Tanggal yang dicetak sekarang Kalender CurrentPrintDay = Startday; while (true) {// tambahkan satu tanggal ke currentprintday.add (calendar.date, 1); // Setelah menambahkan satu tanggal untuk menentukan apakah tanggal akhir tercapai, cetak itu akan diakhiri jika (CurrentPrintDay.Competo (Endday) == 0) {break; } list.add (formatter.format (currentprintday.gettime ())); } String [] arr = list.toArray (string baru [0]); return arr; }}Hasil eksekusi dalam metode utama adalah:
Ada komentar dalam kode dan dapat disesuaikan sesuai kebutuhan.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.