import lombok.Data;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;/*** @Author : 尤毅鹤* @Date: 2020/08/10 13:29* @Description: <描述>*/
public class MyTest {public static void main(String[] args) {MyTest test = new MyTest();DateTime dateTime = new DateTime();dateTime.setStartTime("2020-10-10 14:38:00");dateTime.setEndTime("2020-10-10 15:28:00");System.out.println(test.Test(dateTime));}public static Double Test(DateTime dateTime) {Double dayHours = 0.0;SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");try {// 获取请假开始时间Date startTime = format.parse(dateTime.getStartTime());// 获取请假结束时间Date endTime = format.parse(dateTime.getEndTime());LocalDate localDate = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();LocalDate localDateEnd = endTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();int days = localDateEnd.getDayOfYear() - localDate.getDayOfYear() - 1;int sum = days;// 请假整天数for (int index = 0; index < days; index++) {LocalDate date = localDate.plusDays(index + 1);DayOfWeek day = date.getDayOfWeek();// 如果是星期六星期天,需要减去一天String todayStr = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));if (DayOfWeek.SUNDAY.equals(day) || DayOfWeek.SATURDAY.equals(day)) {if (!dateTime.getMakeUpLeaveList().contains(todayStr)) {sum--;}}if (dateTime.getHolidayList().contains(todayStr) && !DayOfWeek.SUNDAY.equals(day) && !DayOfWeek.SATURDAY.equals(day)) {sum--;}}dayHours = sum <= dayHours ? dayHours : sum * 8;// 计算开始当天的时间LocalTime localDateTime = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();LocalTime localDateEndTime = endTime.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();if (isCalculate(localDate, dateTime)) {if (localDateTime.getHour() == dateTime.getAmWorkStart() && localDateEnd.getDayOfYear() - localDate.getDayOfYear() > 0) {dayHours += 8;} else {int time = localDateTime.getHour() < dateTime.getPmWorkStart()&& localDateTime.getHour() > dateTime.getAmWorkEnd() ? dateTime.getPmWorkStart() : localDateTime.getHour();int minute = localDateTime.getHour() < dateTime.getPmWorkStart()&& localDateTime.getHour() > dateTime.getAmWorkEnd() ? 0 : localDateTime.getMinute();if (localDate.getDayOfYear() == localDateEnd.getDayOfYear()&& localDateEndTime.getHour() <= dateTime.getAmWorkEnd()&& localDateTime.getHour() <= dateTime.getAmWorkEnd()||localDate.getDayOfYear() == localDateEnd.getDayOfYear()&& localDateEndTime.getHour() <= dateTime.getPmWorkEnd()&& time <= dateTime.getPmWorkEnd()&& localDateEndTime.getHour() >= dateTime.getPmWorkStart()&& time >= dateTime.getPmWorkStart()) {int h = localDateEndTime.getHour() - time;int m = localDateEndTime.getMinute() - minute;dayHours += h + (m > 0 ? 1 : 0);} else {// 早上的时间if (localDateTime.getHour() < dateTime.getAmWorkEnd()) {int AmDate = dateTime.getAmWorkStart() > localDateTime.getHour()? dateTime.getAmWorkEnd() - dateTime.getAmWorkStart(): dateTime.getAmWorkEnd() - localDateTime.getHour();if (localDateEnd.getDayOfYear() - localDate.getDayOfYear() > 0) {dayHours += AmDate + dateTime.getPmWorkEnd() - dateTime.getPmWorkStart();} else {dayHours += AmDate;}} else {// 下午的时间int pMDate = dateTime.getPmWorkEnd() < time ? time - dateTime.getPmWorkStart() : dateTime.getPmWorkEnd() - dateTime.getPmWorkStart();dayHours += pMDate == 0 ? 1.0 : pMDate;}}}}// 计算开始结束的时间if (isCalculate(localDateEnd, dateTime)) {if (localDateEndTime.getHour() == dateTime.getPmWorkEnd() && localDateEnd.getDayOfYear() - localDate.getDayOfYear() > 0) {dayHours += 8;} else {int time = localDateEndTime.getHour() < dateTime.getPmWorkStart() ? dateTime.getPmWorkStart() : localDateEndTime.getHour();if (localDate.getDayOfYear() == localDateEnd.getDayOfYear()&& localDateEndTime.getHour() <= dateTime.getAmWorkEnd()&& localDateTime.getHour() <= dateTime.getAmWorkEnd()||localDate.getDayOfYear() == localDateEnd.getDayOfYear()&& localDateTime.getHour() <= dateTime.getPmWorkEnd()&& time <= dateTime.getPmWorkEnd()&& localDateTime.getHour() >= dateTime.getPmWorkStart()&& time >= dateTime.getPmWorkStart()) {} else {if (localDateEndTime.getHour() < dateTime.getAmWorkEnd()) {int AmDate = dateTime.getAmWorkStart() > localDateEndTime.getHour()? dateTime.getAmWorkEnd() - dateTime.getAmWorkStart(): dateTime.getAmWorkEnd() - localDateEndTime.getHour();dayHours += AmDate == 0 ? 1.0 : AmDate;} else {// 下午的时间int pMDate = dateTime.getPmWorkEnd() > time ? time - dateTime.getPmWorkStart() : dateTime.getPmWorkEnd() - dateTime.getPmWorkStart();if (localDateEndTime.getMinute() > 0 && localDateEndTime.getHour() >= dateTime.getPmWorkStart()) {pMDate += 1.0;}if (localDateEnd.getDayOfYear() - localDate.getDayOfYear() > 0) {dayHours += pMDate + dateTime.getPmWorkEnd() - dateTime.getPmWorkStart();} else {dayHours += pMDate;}}}}}} catch (ParseException e) {e.printStackTrace();}return dayHours;}public static Boolean isCalculate(LocalDate localDate, DateTime dateTime) {Boolean flag = true;DayOfWeek day = localDate.getDayOfWeek();// 如果是星期六星期天,需要减去一天String todayStr = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));if (DayOfWeek.SUNDAY.equals(day) || DayOfWeek.SATURDAY.equals(day)) {if (!dateTime.getMakeUpLeaveList().contains(todayStr)) {flag = false;}}if (dateTime.getHolidayList().contains(todayStr) && !DayOfWeek.SUNDAY.equals(day) && !DayOfWeek.SATURDAY.equals(day)) {flag = false;}return flag;}
}@Data
/*** 这个实体的数据可以从数据中获取*/
class DateTime {private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");private String startTime;private String endTime;private Integer AmWorkStart = 9;private Integer AmWorkEnd = 12;private Integer PmWorkStart = 14;private Integer PmWorkEnd = 18;private ArrayList<String> holidayList = new ArrayList<String>() {{add("2020-10-01");add("2020-10-02");add("2020-10-03");add("2020-10-04");add("2020-10-05");add("2020-10-06");add("2020-10-07");add("2020-10-08");}};private ArrayList<String> makeUpLeaveList = new ArrayList<String>() {{add("2020-10-10");}};}