Java 计算字符串日期时间区间内的工作日数量,并考虑中国节假日
要判断一个字符串表示的开始时间和结束时间是否在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;
}
}
需要根据实际情况自定义判断节假日的逻辑,例如根据国家法定节假日或者公司的特殊节假日进行判断。
原文地址: https://www.cveoy.top/t/topic/mLnH 著作权归作者所有。请勿转载和采集!