需求:统计2020年整年的非工作日天数(包含周末和法定节假日)
思路:
1.代码生成一张2020年日历表
2.统计day_type字段 为 3的天数即为整年的非工作日天数(select count(*)from holiday where day_type = '3' )
@Service
public class HolidayServiceImpl implements HolidayService {
@Autowired
private HolidayMapper holidayMapper;
@Override
public void insertHoliday(){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = sdf.parse("2020-01-01");//开始时间
Date end = sdf.parse("2020-12-31");//结束时间
List<Date> lists = dateSplit(start, end);
if (!lists.isEmpty()) {
for (Date date : lists) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Holiday holiday = new Holiday();
holiday.setId(IdUtils.uuid(false)).setDate(IdUtils.dateToString(date));
if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY) {
//一年当中所有周末插入数据
holidayMapper.insertHoliday(holiday.setTitle("周末").setDayType(3));
}else {
//一年当中除周末插入数据
holidayMapper.insertHoliday(holiday.setTitle("工作日").setDayType(1));
}
}
}
/**
* 一、元旦:2020年1月1日放假,共1天。
* 二、春节:1月24日至30日放假调休,共7天。1月19日(星期日)、2月1日(星期六)上班。
* 三、清明节:4月4日至6日放假调休,共3天。
* 四、劳动节:5月1日至5日放假调休,共5天。4月26日(星期日)、5月9日(星期六)上班。
* 五、端午节:6月25日至27日放假调休,共3天。6月28日(星期日)上班。
* 六、国庆节、中秋节:10月1日至8日放假调休,共8天。9月27日(星期日)、10月10日(星期六)上班。
*/
//节假日
List<String> dayLists = Arrays.asList("2020-01-01",
"2020-01-24", "2020-01-25", "2020-01-26", "2020-01-27", "2020-01-28", "2020-01-29", "2020-01-30",
"2020-04-04", "2020-04-05", "2020-04-06",
"2020-05-01", "2020-05-02", "2020-05-03", "2020-05-04", "2020-05-05",
"2020-06-25", "2020-06-26", "2020-06-27",
"2020-10-01", "2020-10-02", "2020-10-03", "2020-10-04", "2020-10-05", "2020-10-06", "2020-10-07", "2020-10-08");
holidayMapper.updateHoliday(dayLists);
//节假日调休
List<String> workLists = Arrays.asList("2020-01-19", "2020-02-01",
"2020-04-26", "2020-05-09",
"2020-06-28", "2020-09-27", "2020-10-10");
holidayMapper.updateWorkHoliday(workLists);
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<Date> dateSplit(Date start, Date end)
throws Exception {
if (!start.before(end))
throw new Exception("开始时间应该在结束时间之后");
Long spi = end.getTime() - start.getTime();
Long step = spi / (24 * 60 * 60 * 1000);// 相隔天数
List<Date> dateList = new ArrayList<>();
dateList.add(end);
for (int i = 1; i <= step; i++) {
dateList.add(new Date(dateList.get(i - 1).getTime()
- (24 * 60 * 60 * 1000)));// 比上一天减一
}
return dateList;
}
}
@Mapper
public interface HolidayMapper {
void insertHoliday(Holiday holiday);
void updateHoliday(@Param("list") List<String> dayLists);
void updateWorkHoliday(@Param("list")List<String> workLists);
}
<insert id="insertHoliday">
insert into holiday (id,title,date,day_type)
values (#{id},#{title},#{date},#{dayType})
</insert>
<update id="updateHoliday" parameterType="java.util.List">
update holiday set title = '假期日', day_type = 3
where date in
<foreach collection="list" index="index" item="item"
separator="," open="(" close=")">
#{item}
</foreach>
</update>
<update id="updateWorkHoliday" parameterType="java.util.List">
update holiday set title = '假期调休工作日', day_type = 2
where date in
<foreach collection="list" index="index" item="item"
separator="," open="(" close=")">
#{item}
</foreach>
</update>