要判断一个字符串表示的开始时间和结束时间是否在5,10,15,20个工作日内,并考虑中国节假日,可以使用Java的Date类和Calendar类来实现。

首先,需要将字符串表示的开始时间和结束时间转换为Date对象。可以使用SimpleDateFormat类来进行格式化转换:

String startTimeStr = '2022-12-01 09:00:00';
String endTimeStr = '2022-12-10 18:00:00';

SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss');
Date startTime = sdf.parse(startTimeStr);
Date endTime = sdf.parse(endTimeStr);

接下来,可以使用Calendar类来计算开始时间和结束时间之间的工作日数量。首先,需要获取开始时间和结束时间所在的年份、月份、日期:

Calendar startCal = Calendar.getInstance();
startCal.setTime(startTime);

int startYear = startCal.get(Calendar.YEAR);
int startMonth = startCal.get(Calendar.MONTH);
int startDay = startCal.get(Calendar.DAY_OF_MONTH);

Calendar endCal = Calendar.getInstance();
endCal.setTime(endTime);

int endYear = endCal.get(Calendar.YEAR);
int endMonth = endCal.get(Calendar.MONTH);
int endDay = endCal.get(Calendar.DAY_OF_MONTH);

然后,可以使用循环来遍历开始时间和结束时间之间的每一天,判断是否为工作日。可以使用中国节假日的API或者自定义一个判断方法来判断是否为节假日。这里以自定义方法为例:

int workDays = 0;

for (int year = startYear; year <= endYear; year++) {
    int monthStart = (year == startYear) ? startMonth : 0;
    int monthEnd = (year == endYear) ? endMonth : 11;
    
    for (int month = monthStart; month <= monthEnd; month++) {
        int dayStart = (year == startYear && month == startMonth) ? startDay : 1;
        int dayEnd = (year == endYear && month == endMonth) ? endDay : getDaysInMonth(year, month);
        
        for (int day = dayStart; day <= dayEnd; day++) {
            if (isWorkingDay(year, month, day)) {
                workDays++;
            }
        }
    }
}

其中,getDaysInMonth方法可以获取指定年份和月份的天数:

private static int getDaysInMonth(int year, int month) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, 1);
    cal.add(Calendar.MONTH, 1);
    cal.add(Calendar.DAY_OF_MONTH, -1);
    return cal.get(Calendar.DAY_OF_MONTH);
}

isWorkingDay方法可以判断指定日期是否为工作日,可以自定义判断逻辑,例如排除周末和节假日:

private static boolean isWorkingDay(int year, int month, int day) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, day);
    int weekDay = cal.get(Calendar.DAY_OF_WEEK);
    
    // 排除周末
    if (weekDay == Calendar.SATURDAY || weekDay == Calendar.SUNDAY) {
        return false;
    }
    
    // 排除节假日(自定义判断逻辑)
    if (isHoliday(year, month, day)) {
        return false;
    }
    
    return true;
}

最后,可以根据工作日数量判断是否在5,10,15,20个工作日内:

int[] targetWorkDays = {5, 10, 15, 20};

for (int target : targetWorkDays) {
    if (workDays <= target) {
        System.out.println('在' + target + '个工作日内');
        break;
    }
}

完整示例代码如下:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {
    
    public static void main(String[] args) throws Exception {
        String startTimeStr = '2022-12-01 09:00:00';
        String endTimeStr = '2022-12-10 18:00:00';
        
        SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss');
        Date startTime = sdf.parse(startTimeStr);
        Date endTime = sdf.parse(endTimeStr);
        
        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startTime);
        
        int startYear = startCal.get(Calendar.YEAR);
        int startMonth = startCal.get(Calendar.MONTH);
        int startDay = startCal.get(Calendar.DAY_OF_MONTH);
        
        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endTime);
        
        int endYear = endCal.get(Calendar.YEAR);
        int endMonth = endCal.get(Calendar.MONTH);
        int endDay = endCal.get(Calendar.DAY_OF_MONTH);
        
        int workDays = 0;
        
        for (int year = startYear; year <= endYear; year++) {
            int monthStart = (year == startYear) ? startMonth : 0;
            int monthEnd = (year == endYear) ? endMonth : 11;
            
            for (int month = monthStart; month <= monthEnd; month++) {
                int dayStart = (year == startYear && month == startMonth) ? startDay : 1;
                int dayEnd = (year == endYear && month == endMonth) ? endDay : getDaysInMonth(year, month);
                
                for (int day = dayStart; day <= dayEnd; day++) {
                    if (isWorkingDay(year, month, day)) {
                        workDays++;
                    }
                }
            }
        }
        
        int[] targetWorkDays = {5, 10, 15, 20};
        
        for (int target : targetWorkDays) {
            if (workDays <= target) {
                System.out.println('在' + target + '个工作日内');
                break;
            }
        }
    }
    
    private static int getDaysInMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, 1);
        cal.add(Calendar.MONTH, 1);
        cal.add(Calendar.DAY_OF_MONTH, -1);
        return cal.get(Calendar.DAY_OF_MONTH);
    }
    
    private static boolean isWorkingDay(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day);
        int weekDay = cal.get(Calendar.DAY_OF_WEEK);
        
        // 排除周末
        if (weekDay == Calendar.SATURDAY || weekDay == Calendar.SUNDAY) {
            return false;
        }
        
        // 排除节假日(自定义判断逻辑)
        if (isHoliday(year, month, day)) {
            return false;
        }
        
        return true;
    }
    
    private static boolean isHoliday(int year, int month, int day) {
        // 自定义节假日判断逻辑
        return false;
    }
}

需要根据实际情况自定义判断节假日的逻辑,例如根据国家法定节假日或者公司的特殊节假日进行判断。

Java 计算字符串日期时间区间内的工作日数量,并考虑中国节假日

原文地址: https://www.cveoy.top/t/topic/mLnH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录