java法定假日_Java 排除法定节假日、周六日以及工作日午休,计算两个Date相差的时间...
时间: 2024-03-25 17:41:04 浏览: 225
您好,可以使用Java的Joda-Time库来计算日期之间的时间差,并排除法定节假日、周六日以及工作日午休。下面是一个示例代码:
```java
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Duration;
import org.joda.time.Interval;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DateUtil {
// 法定节假日列表
private static final List<LocalDate> HOLIDAYS = Arrays.asList(
// 2021年节假日
new LocalDate(2021, 1, 1), // 元旦
new LocalDate(2021, 2, 11), // 春节
new LocalDate(2021, 2, 12),
new LocalDate(2021, 2, 13),
new LocalDate(2021, 2, 14),
new LocalDate(2021, 2, 15),
new LocalDate(2021, 2, 16),
new LocalDate(2021, 2, 17),
new LocalDate(2021, 4, 3), // 清明节
new LocalDate(2021, 5, 1), // 劳动节
new LocalDate(2021, 5, 2),
new LocalDate(2021, 5, 3),
new LocalDate(2021, 6, 12), // 端午节
new LocalDate(2021, 9, 19), // 中秋节
new LocalDate(2021, 10, 1), // 国庆节
new LocalDate(2021, 10, 2),
new LocalDate(2021, 10, 3),
new LocalDate(2021, 10, 4),
new LocalDate(2021, 10, 5),
new LocalDate(2021, 10, 6),
new LocalDate(2021, 10, 7)
);
// 工作日午休时间段
private static final Interval WORKDAY_LUNCH_TIME = new Interval(
new LocalTime(12, 0, 0),
new LocalTime(13, 0, 0)
);
// 工作日上班时间段
private static final Interval WORKDAY_OFFICE_TIME = new Interval(
new LocalTime(9, 0, 0),
new LocalTime(18, 0, 0)
);
/**
* 计算两个日期相差的天数,排除法定节假日、周六日以及工作日午休
*
* @param startDate 开始日期
* @param endDate 结束日期
* @return 相差天数
*/
public static int getDaysBetweenExcludingHolidays(LocalDate startDate, LocalDate endDate) {
// 计算相差天数(包括开始日期和结束日期)
int days = Days.daysBetween(startDate, endDate).getDays() + 1;
// 排除法定节假日、周六日以及工作日午休
LocalDate date = startDate;
int excludedDays = 0;
for (int i = 0; i < days; i++) {
if (isHoliday(date) || isWeekend(date) || isWorkdayLunchTime(date)) {
excludedDays++;
} else if (isWorkdayOfficeTime(date)) {
// 工作日并且不在午休时间段内
excludedDays += 0;
} else {
excludedDays++;
}
date = date.plusDays(1);
}
return days - excludedDays;
}
/**
* 判断日期是否为法定节假日
*
* @param date 日期
* @return 是否为法定节假日
*/
private static boolean isHoliday(LocalDate date) {
return HOLIDAYS.contains(date);
}
/**
* 判断日期是否为周六日
*
* @param date 日期
* @return 是否为周六日
*/
private static boolean isWeekend(LocalDate date) {
return date.dayOfWeek().get() == 6 || date.dayOfWeek().get() == 7;
}
/**
* 判断日期是否为工作日午休时间段
*
* @param date 日期
* @return 是否为工作日午休时间段
*/
private static boolean isWorkdayLunchTime(LocalDate date) {
DateTime dateTime = date.toDateTimeAtStartOfDay();
return WORKDAY_LUNCH_TIME.contains(dateTime);
}
/**
* 判断日期是否为工作日上班时间段
*
* @param date 日期
* @return 是否为工作日上班时间段
*/
private static boolean isWorkdayOfficeTime(LocalDate date) {
DateTime dateTime = date.toDateTimeAtStartOfDay();
return WORKDAY_OFFICE_TIME.contains(dateTime);
}
public static void main(String[] args) {
LocalDate startDate = new LocalDate(2021, 4, 1);
LocalDate endDate = new LocalDate(2021, 4, 8);
int days = getDaysBetweenExcludingHolidays(startDate, endDate);
System.out.println("相差天数:" + days);
}
}
```
在上面的代码中,首先定义了法定节假日列表、工作日午休时间段以及工作日上班时间段。然后定义了四个私有方法,分别判断一个日期是否为法定节假日、周六日、工作日午休时间段以及工作日上班时间段。最后,提供了一个公共方法 `getDaysBetweenExcludingHolidays`,该方法接收开始日期和结束日期两个参数,返回两个日期之间相差的天数,排除法定节假日、周六日以及工作日午休时间段。最后在 `main` 方法中测试了一下该方法的使用。
阅读全文