统计整年中的非工作日天数

需求:统计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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值