获取每个月最后一个非节假日的工作日
时间: 2023-11-15 16:28:22 浏览: 129
年日历实现,维护工作日和休息日,初始化法定节假日
获取每个月最后一个非节假日的工作日可以分为三步:
1. 获取当月最后一天
2. 如果最后一天是周六或周日,则向前推到最后一个工作日
3. 如果最后一天是节假日,则不断向前推到最后一个非节假日的工作日
以下是一个示例代码:
```java
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.TemporalAdjusters;
public class LastWorkdayOfMonthWithoutHolidayExample {
public static void main(String[] args) {
int year = 2021;
Month[] months = {Month.JANUARY, Month.FEBRUARY, Month.MARCH, Month.APRIL, Month.MAY, Month.JUNE,
Month.JULY, Month.AUGUST, Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER};
for (Month month : months) {
// 获取当月最后一天
LocalDate lastDayOfMonth = LocalDate.of(year, month, 1)
.with(TemporalAdjusters.lastDayOfMonth());
// 如果最后一天是周六或周日,则向前推到最后一个工作日
DayOfWeek lastDayOfWeek = lastDayOfMonth.getDayOfWeek();
if (lastDayOfWeek == DayOfWeek.SATURDAY || lastDayOfWeek == DayOfWeek.SUNDAY) {
lastDayOfMonth = lastDayOfMonth.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
}
// 如果最后一天是节假日,则向前推到最后一个非节假日的工作日
while (isHoliday(lastDayOfMonth)) {
lastDayOfMonth = lastDayOfMonth.minusDays(1);
}
System.out.println(month + "月最后一个非节假日的工作日:" + lastDayOfMonth);
}
}
// 判断一个日期是否是节假日
private static boolean isHoliday(LocalDate date) {
// 这里假设元旦、春节、清明节、劳动节、端午节、中秋节和国庆节都是节假日
return date.getMonth() == Month.JANUARY && date.getDayOfMonth() == 1 ||
isSpringFestival(date) ||
date.getMonth() == Month.APRIL && date.getDayOfMonth() == 4 ||
date.getMonth() == Month.MAY && date.getDayOfMonth() == 1 ||
isDragonBoatFestival(date) ||
isMidAutumnFestival(date) ||
date.getMonth() == Month.OCTOBER && date.getDayOfMonth() == 1 ||
date.getMonth() == Month.OCTOBER && date.getDayOfMonth() == 2 ||
date.getMonth() == Month.OCTOBER && date.getDayOfMonth() == 3;
}
// 判断一个日期是否是春节
private static boolean isSpringFestival(LocalDate date) {
int year = date.getYear();
LocalDate springFestival = LocalDate.of(year, Month.JANUARY, 1)
.with(TemporalAdjusters.firstDayOfNextMonth())
.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
if (springFestival.getMonth() == Month.FEBRUARY) {
springFestival = springFestival.minusDays(7);
}
return date.equals(springFestival) || date.equals(springFestival.plusDays(1)) ||
date.equals(springFestival.plusDays(2)) || date.equals(springFestival.plusDays(3)) ||
date.equals(springFestival.plusDays(4)) || date.equals(springFestival.plusDays(5)) ||
date.equals(springFestival.plusDays(6));
}
// 判断一个日期是否是端午节
private static boolean isDragonBoatFestival(LocalDate date) {
int year = date.getYear();
LocalDate dragonBoatFestival = LocalDate.of(year, Month.JUNE, 1)
.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY))
.plusWeeks(2);
return date.equals(dragonBoatFestival);
}
// 判断一个日期是否是中秋节
private static boolean isMidAutumnFestival(LocalDate date) {
int year = date.getYear();
LocalDate midAutumnFestival = LocalDate.of(year, Month.SEPTEMBER, 1)
.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY))
.plusWeeks(2);
return date.equals(midAutumnFestival);
}
}
```
在上面的代码中,我们使用Java 8提供的日期和时间API来获取当月最后一天,并使用TemporalAdjusters工具类来实现日期调整。如果最后一天是周六或周日,则向前推到最后一个工作日。如果最后一天是节假日,则不断向前推到最后一个非节假日的工作日。最后输出每个月最后一个非节假日的工作日的结果。为了简化示例代码,这里假设元旦、春节、清明节、劳动节、端午节、中秋节和国庆节都是节假日,实际情况可能会有所不同,需要根据实际情况进行调整。
阅读全文