Java实现各种节日维护 农历,阳历,二十四节气 自定义节日,根据当前日期获取节日

背景:管理后台添加节日规则,前端展示节日

后台页面
前端页面

实现方案设计

将所有节日分类,每类节日对应一个时间计算规则,添加节日时生成该节日近50年的时间,前端查询节日时,根据传入时间戳,即可查询最近节日。

代码:

@Getter
@AllArgsConstructor
public enum FestivalCreateTypeEnum {

    SOLAR_DAY(1,"阳历的某月某天"),
    LUNAR_DAY(2,"阴历的某月某天"),
    TWENTY_FOUR(3,"二十四节气"),
    WEEK_DAY(4,"每年某月某周周几"),
    LAST_WEEK_DAY(6,"每年某月最后一周周几"),
    F_BEFORE(5,"某个节日的前几天");

    private final int code;

    private final String desc;

    private static final Map<Integer, FestivalCreateTypeEnum> map = new HashMap<>();


    static {
        for (FestivalCreateTypeEnum typeEnum: FestivalCreateTypeEnum.values()) {
            map.put(typeEnum.getCode(), typeEnum);
        }
    }


    public static  FestivalCreateTypeEnum getEnum(int code){
        return map.get(code);
    }

}
//添加节日入参
@Data
public class AddCalendarDto implements Serializable {

    /**
     * 创建类型 1-阳历每年某月某天,2-农历每年某与某天,
     * 3-二十四节气,4-每年某月某周 周几,5-某个节日的前几天or后几天
     * */
    private Integer createType;

    /**
     * 节日类型
     * */
    private Integer typeId;

    /**
     * 节日名称
     * */
    private String name;
    /**
     * 第几月
     * */
    private Integer monthNum;
    /**
     * 第几天
     * */
    private Integer dayNum;
    /**
     * 第几周
     * */
    private Integer weekCount;
    /**
     * 周几
     * */
    private Integer weekNum;

    /**
     * 二十四节气对应C值
     * */
    private Double c;

    /**
     * 时间
     * */
    private Long date;

    /**
     * 状态 0无效 1有效
     * */
    private Integer status;


    /**
     * 每个节气对应的顺序 0-小寒 1大寒 2立春 3雨水 4惊蛰 5春分 6清明 7谷雨 8立夏 9小满 10芒种 11夏至
     * 12小暑 13大暑 14立秋 15处暑 16白露 17秋分 18寒露 19霜降 20立冬 21小雪 22大雪 23冬至
     */
    private Integer sort;

    /**
     * 时间类型 0非规律时间 1规律时间
     * */
    private Integer timeType;

    private String alias;
    private String desc;
    private String displayName;

    private String imageUrl;

    private String keyWords;

    private Integer festivalId;

    private List<Long> dateList;
}
//添加节日方法
public ServerResponse addFestival(AddCalendarDto param) {
        if (param.getTimeType() == null || StringUtils.isBlank(param.getName())) {
            return ServerResponse.createByError(-1,"参数错误");
        }
        //判断是否已经有该节日
        FestivalDo festivalDo = festivalDao.selectByName(param.getName());
        if (!Objects.isNull(festivalDo)) {
            return ServerResponse.createByError(-2,"该节日已存在");
        }
        //自定义节日
        if (param.getTimeType() == 0) {
            if (CollectionUtils.isEmpty(param.getDateList())) {
                return ServerResponse.createByError(-1,"参数错误");
            }
            CustomizeFestivalDto customizeFestivalDto = new CustomizeFestivalDto();
            customizeFestivalDto = (CustomizeFestivalDto)convertFesDto(customizeFestivalDto, param);
            customizeFestivalDto.setDateList(param.getDateList());
            customizeFestivalFactory.createFestival(customizeFestivalDto);
            return ServerResponse.createBySuccess();
        }
        //已有规律性节日
        FestivalCreateTypeEnum fTypeEnum = FestivalCreateTypeEnum.getEnum(param.getCreateType());
        if (Objects.isNull(fTypeEnum)) {
            return ServerResponse.createByError(-3,"节日创建类型错误");
        }
        boolean isSuccess = false;
        switch (fTypeEnum) {
            case F_BEFORE://依附于某个节日-寒食
                if (param.getFestivalId() == null || param.getDayNum()==0) {
                    break;
                }
                BeforeFestivalDto beforeFestivalDto = new BeforeFestivalDto();
                beforeFestivalDto = (BeforeFestivalDto)convertFesDto(beforeFestivalDto, param);
                beforeFestivalDto.setFestivalId(param.getFestivalId());
                beforeFestivalDto.setDayCount(param.getDayNum());
                isSuccess = beforeFestivalFactory.createFestival(beforeFestivalDto);
                break;
            case WEEK_DAY://周几的节日-母亲节
                if (param.getMonthNum()<0 || param.getWeekCount()<0 || param.getWeekNum()<0) {
                    break;
                }
                WeekFestivalDto weekFestivalDto = new WeekFestivalDto();
                weekFestivalDto = (WeekFestivalDto)convertFesDto(weekFestivalDto, param);
                weekFestivalDto.setMonthNum(param.getMonthNum());
                weekFestivalDto.setWeekCount(param.getWeekCount());
                weekFestivalDto.setWeekNum(param.getWeekNum());
                isSuccess = weekFestivalFactory.createFestival(weekFestivalDto);
                break;
            case LUNAR_DAY://农历的节日-春节
                if (param.getMonthNum()<0 || param.getDayNum()<0) {
                    break;
                }
                LunarFestivalDto lFestivalDto = new LunarFestivalDto();
                lFestivalDto = (LunarFestivalDto)convertFesDto(lFestivalDto, param);
                lFestivalDto.setMonthNum(param.getMonthNum());
                lFestivalDto.setDayNum(param.getDayNum());
                isSuccess = lunarFestivalFactory.createFestival(lFestivalDto);
                break;
            case SOLAR_DAY://阳历的节日-劳动节
                if (param.getMonthNum() < 0 || param.getDayNum() < 0) {
                    break;
                }
                SolarFestivalDto sFestivalDto = new SolarFestivalDto();
                sFestivalDto = (SolarFestivalDto)convertFesDto(sFestivalDto, param);
                sFestivalDto.setMonthNum(param.getMonthNum());
                sFestivalDto.setDayNum(param.getDayNum());
                isSuccess = solarFestivalFactory.createFestival(sFestivalDto);
                break;
            case TWENTY_FOUR://二十四节气
                if (param.getSort() < 0 || param.getC() < 0) {
                    break;
                }
                TwentyFourFestivalDto tfParam = new TwentyFourFestivalDto();
                tfParam = (TwentyFourFestivalDto)convertFesDto(tfParam, param);
                tfParam.setC(param.getC());
                tfParam.setSort(param.getSort());
                tfParam.setName(tfParam.getName());
                isSuccess = twentyFourFestivalFactory.createFestival(tfParam);
                break;
            case LAST_WEEK_DAY://最后一周的周几-地球一小时
                if (param.getMonthNum() < 0 || param.getWeekNum() < 0) {
                    break;
                }
                LastWeekFestivalDto lastWeekFestivalDto = new LastWeekFestivalDto();
                lastWeekFestivalDto = (LastWeekFestivalDto)convertFesDto(lastWeekFestivalDto, param);
                lastWeekFestivalDto.setMonthNum(param.getMonthNum());
                lastWeekFestivalDto.setWeekNum(param.getWeekNum());
                isSuccess = lastWeekFestivalFactory.createFestival(lastWeekFestivalDto);
                break;
            default:
                break;
        }
        if (isSuccess) {
            return ServerResponse.createBySuccess();
        }
        return ServerResponse.createByError(-10,"创建节日失败");
    }
//阳历节日
@Service
@Slf4j
public class SolarFestivalFactoryImpl implements FestivalFactory {

    @Autowired
    private FestivalDao festivalDao;
    @Autowired
    private FestivalTimeDao festivalTimeDao;

    @Override
    public boolean createFestival(FestivalDto festivalDto) {
        //创建近3年的节日
        SolarFestivalDto solarFestivalDto = (SolarFestivalDto)festivalDto;
        FestivalDo festivalDo = new FestivalDo();
        festivalDo = DomainConvertUtils.festivalConvertDo(solarFestivalDto,festivalDo);
        festivalDo.setMonthNum(solarFestivalDto.getMonthNum());
        festivalDo.setDayNum(solarFestivalDto.getDayNum());
        festivalDao.insertSelective(festivalDo);
        FestivalDo fDo = festivalDao.selectByName(solarFestivalDto.getName());
        if (Objects.isNull(fDo)) {
            return false;
        }
        List<FestivalTimeDo> festivalTimeDos = Lists.newArrayList();
        //获取当前年
        Calendar rightNow = Calendar.getInstance();
        int year = rightNow.get(Calendar.YEAR);// 获取当前年份
        for (int i=0;i<50;i++) {
            FestivalTimeDo festivalTimeDo = new FestivalTimeDo();
            festivalTimeDo.setStatus(1);
            festivalTimeDo.setFestivalId(fDo.getId());
            String str = year+i+"-"+solarFestivalDto.getMonthNum()+"-"+solarFestivalDto.getDayNum();
            try {
                Date date = DateUtils.parseDate(str, "yyyy-MM-dd");
                festivalTimeDo.setTime(date);
                festivalTimeDos.add(festivalTimeDo);
            } catch (Exception e) {}
        }
        log.info("[SolarFestivalFactoryImpl]festivalTimeDos:{}", JSON.toJSONString(festivalTimeDos));
        if (CollectionUtils.isNotEmpty(festivalTimeDos)) {
            festivalTimeDao.batchInsert(festivalTimeDos);
        }

        return true;
    }

}
//农历节日
@Service
@Slf4j
public class LunarFestivalFactoryImpl implements FestivalFactory {

    @Autowired
    private FestivalDao festivalDao;
    @Autowired
    private FestivalTimeDao festivalTimeDao;

    @Override
    public boolean createFestival(FestivalDto festivalDto) {
        //创建近3年的节日
        LunarFestivalDto lunarFestivalDto = (LunarFestivalDto)festivalDto;
        FestivalDo festivalDo = new FestivalDo();
        festivalDo = DomainConvertUtils.festivalConvertDo(lunarFestivalDto,festivalDo);
        festivalDo.setMonthNum(lunarFestivalDto.getMonthNum());
        festivalDo.setDayNum(lunarFestivalDto.getDayNum());
        festivalDao.insertSelective(festivalDo);
        FestivalDo fDo = festivalDao.selectByName(lunarFestivalDto.getName());
        if (Objects.isNull(fDo)) {
            return false;
        }
        List<FestivalTimeDo> festivalTimeDos = Lists.newArrayList();
        //获取当前年
        Calendar rightNow = Calendar.getInstance();
        int year = rightNow.get(Calendar.YEAR);// 获取当前年份
        for (int i=0;i<50;i++) {
            FestivalTimeDo festivalTimeDo = new FestivalTimeDo();
            festivalTimeDo.setFestivalId(fDo.getId());
            festivalTimeDo.setStatus(1);
            //指定阴历的某一天
            Lunar luDate = new Lunar(year+i,lunarFestivalDto.getMonthNum(),lunarFestivalDto.getDayNum());
            festivalTimeDo.setTime(luDate.getSolar().getCalendar().getTime());
            festivalTimeDos.add(festivalTimeDo);
        }
        //批量添加
        festivalTimeDao.batchInsert(festivalTimeDos);
        return true;
    }
}
//二十四节气
@Service
@Slf4j
public class TwentyFourFestivalFactoryImpl implements FestivalFactory {

    @Autowired
    private FestivalDao festivalDao;
    @Autowired
    private FestivalTimeDao festivalTimeDao;

    //二十四节气日期偏移度
    private static final double D = 0.2422;
    //特殊年份节气日期偏移
    private final static Map<Integer, Integer[]> INCREASE_OFFSETMAP = new HashMap<Integer, Integer[]>();//+1偏移
    private final static Map<Integer, Integer[]> DECREASE_OFFSETMAP = new HashMap<Integer, Integer[]>();//-1偏移

    @Override
    public boolean createFestival(FestivalDto festivalDto) {
        TwentyFourFestivalDto tfFestivalDto = (TwentyFourFestivalDto) festivalDto;
        FestivalDo festivalDo = new FestivalDo();
        festivalDo = DomainConvertUtils.festivalConvertDo(tfFestivalDto,festivalDo);
        festivalDao.insertSelective(festivalDo);
        FestivalDo fDo = festivalDao.selectByName(tfFestivalDto.getName());
        if (Objects.isNull(fDo)) {
            return false;
        }
        List<FestivalTimeDo> festivalTimeDos = Lists.newArrayList();
        log.info("[TwentyFourFestivalFactoryImpl]tfFestivalDto:{}",tfFestivalDto);
        //获取当前年
        Calendar rightNow = Calendar.getInstance();
        int year = rightNow.get(Calendar.YEAR);
        for (int i=0;i<50;i++) {
            Date date = sTerm(year + i, tfFestivalDto.getSort(), tfFestivalDto.getC());
            if (date == null) {
                break;
            }
            FestivalTimeDo festivalTimeDo = new FestivalTimeDo();
            festivalTimeDo.setFestivalId(fDo.getId());
            festivalTimeDo.setStatus(1);
            festivalTimeDo.setTime(date);
            festivalTimeDos.add(festivalTimeDo);
        }
        log.info("[TwentyFourFestivalFactoryImpl]festivalTimeDos:{}", JSON.toJSONString(festivalTimeDos));
        if (CollectionUtils.isNotEmpty(festivalTimeDos)) {
            festivalTimeDao.batchInsert(festivalTimeDos);
        }
        return true;
    }



    /**
     * 获取某年的第n个节气为几日(从0小寒起算)
     *
     * @param year
     * @param n
     * @param centuryValue 气的21世纪C值,每个节气的世纪值都不同
     * @return
     */
    private Date sTerm(int year, int n,double centuryValue) {
        int dateNum = 0;
        int y = year % 100;//步骤1:取年分的后两位数
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {//闰年
            if (n == 0 || n == 1 || n == 2 || n == 3) {
                //注意:凡闰年3月1日前闰年数要减一,即:L=[(Y-1)/4],因为小寒、大寒、立春、雨水这两个节气都小于3月1日,所以 y = y-1
                y = y - 1;//步骤2
            }
        }
        //获取月份

        int month = getFesMonth(n);
        dateNum = (int) (y * D + centuryValue) - (int) (y / 4);//步骤3,使用公式[Y*D+C]-L计算
        dateNum += specialYearOffset(year, n);//步骤4,加上特殊的年分的节气偏移量
        //获取当前年的第一天
        String dateStr = year+"-"+month+"-"+01;
        try {
            Date date = DateUtils.parseDate(dateStr, "yyyy-MM-dd");
            Date date1 = DateUtils.addDays(date, dateNum-1);
            return date1;
        } catch (Exception e) {

        }
        return null;
    }


    //获取每个节气对应的月份
    private int getFesMonth(int sort) {
        if (sort>24 || sort<0) {
            return 0;
        }
        if (sort < 2) {//0 1
            return 1;
        } else if (1 < sort && sort < 4) {//2 3
            return 2;
        } else if (sort>3 && sort<6) {// 4 5
            return 3;
        } else if (sort>5 && sort<8) {//6 7
            return 4;
        } else if (sort>7 && sort<10) {//8 9
            return 5;
        } else if (sort>9 && sort<12) {//10 11
            return 6;
        } else if (sort>11 && sort<14) {//12 13
            return 7;
        } else if (sort>13 && sort<16) {//14 15
            return 8;
        } else if (sort>15 && sort<18) {//16 17
            return 9;
        } else if (sort>17 && sort<20) {//18 19
            return 10;
        } else if (sort>19 && sort<22) {//20 21
            return 11;
        } else if (sort>21 && sort<24) {//22 23
            return 12;
        }
        return 0;
    }

    /**
     * 特例,特殊的年分的节气偏移量,由于公式并不完善,所以算出的个别节气的第几天数并不准确,在此返回其偏移量
     *
     * @param year 年份
     * @param n    节气编号
     * @return 返回其偏移量
     */
    private int specialYearOffset(int year, int n) {
        int offset = 0;
        offset += getOffset(DECREASE_OFFSETMAP, year, n, -1);
        offset += getOffset(INCREASE_OFFSETMAP, year, n, 1);
        return offset;
    }

    /**
     * 节气偏移量计算
     *
     * @param map
     * @param year
     * @param n
     * @param offset
     * @return
     */
    private int getOffset(Map<Integer, Integer[]> map, int year, int n, int offset) {
        int off = 0;
        Integer[] years = map.get(n);
        if (null != years) {
            for (int i : years) {
                if (i == year) {
                    off = offset;
                    break;
                }
            }
        }
        return off;
    }

}

//周几的节日-母亲节
@Service("weekFestivalFactory")
@Slf4j
public class WeekFestivalFactoryImpl implements FestivalFactory {

    @Autowired
    private FestivalTimeDao festivalTimeDao;

    @Autowired
    private FestivalDao festivalDao;

    @DubboReference
    TemplateService templateService;

    @Override
    public boolean createFestival(FestivalDto festivalDto) {
        //创建50年的节日
        WeekFestivalDto weekFestivalDto = (WeekFestivalDto) festivalDto;
        FestivalDo festivalDo = new FestivalDo();
        festivalDo = DomainConvertUtils.festivalConvertDo(weekFestivalDto,festivalDo);
        festivalDo.setMonthNum(weekFestivalDto.getMonthNum());
        festivalDo.setWeekCount(weekFestivalDto.getWeekCount());
        festivalDo.setWeekNum(weekFestivalDto.getWeekNum());
        festivalDao.insertSelective(festivalDo);
        FestivalDo fDo = festivalDao.selectByName(weekFestivalDto.getName());
        if (Objects.isNull(fDo)) {
            return false;
        }
        log.info("[WeekFestivalFactoryImpl]fDo:{}",fDo);
        List<FestivalTimeDo> festivalTimeDos = Lists.newArrayList();
        //获取当前年
        Calendar rightNow = Calendar.getInstance();
        int year = rightNow.get(Calendar.YEAR);// 获取当前年份
        for (int i = 0; i < 50; i++) {
            Date date = getSundayFestival(year + i, weekFestivalDto.getMonthNum(), weekFestivalDto.getWeekCount(), weekFestivalDto.getWeekNum());
            if (date == null) {
                break;
            }
            FestivalTimeDo festivalTimeDo = new FestivalTimeDo();
            festivalTimeDo.setTime(date);
            festivalTimeDo.setFestivalId(fDo.getId());
            festivalTimeDo.setStatus(1);
            festivalTimeDos.add(festivalTimeDo);
        }
        log.info("[WeekFestivalFactoryImpl]festivalTimeDos:{}", JSON.toJSONString(festivalTimeDos));
        if (CollectionUtils.isNotEmpty(festivalTimeDos)) {
            festivalTimeDao.batchInsert(festivalTimeDos);
        }
        return true;
    }


    /**
     * 周日的节日
     *
     * @param year
     * @param month
     * @param weekCount 第几个周
     * @param weekNum   周几
     */
    private Date getSundayFestival(int year, int month, int weekCount, int weekNum) {
        //获取当前年的第一天
        String dateStr = year + "-" + month + "-" + 01;
        Date date = null;
        try {
            date = DateUtils.parseDate(dateStr, "yyyy-MM-dd");
        } catch (Exception e) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int dayCount = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);
        int sundays = 0;
        int mondays = 0;
        int tuesdays = 0;
        int wednesdays = 0;
        int thursdays = 0;
        int fridays = 0;
        int saturdays = 0;
        for (int i = 1; i <= dayCount; i++) {
            cal.set(Calendar.DATE, i);
            switch (weekNum) {
                case 7://周日
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                        sundays++;
                        if (sundays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;
                case 1://周一
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
                        mondays++;
                        if (mondays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;

                case 2://周二
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
                        tuesdays++;
                        if (tuesdays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;

                case 3://周三
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) {
                        wednesdays++;
                        if (wednesdays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;

                case 4://周四
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
                        thursdays++;
                        if (thursdays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;

                case 5://周五
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
                        fridays++;
                        if (fridays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;

                case 6://周六
                    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                        saturdays++;
                        if (saturdays == weekCount) {
                            String fDateStr = year + "-" + month + "-" + i;
                            try {
                                Date fDate = DateUtils.parseDate(fDateStr, "yyyy-MM-dd");
                                return fDate;
                            } catch (Exception e) {
                                return null;
                            }
                        }
                    }
                    break;
                default:
                    break;
            }
        }
        return null;
    }
}

//最后一周周几的节日
@Service
@Slf4j
public class LastWeekFestivalFactoryImpl implements FestivalFactory {

    @Autowired
    private FestivalDao festivalDao;
    @Autowired
    private FestivalTimeDao festivalTimeDao;

    @Override
    public boolean createFestival(FestivalDto festivalDto) {
        //创建近3年的节日
        LastWeekFestivalDto lastWeekDto = (LastWeekFestivalDto)festivalDto;
        FestivalDo festivalDo = new FestivalDo();
        festivalDo = DomainConvertUtils.festivalConvertDo(lastWeekDto,festivalDo);
        festivalDo.setMonthNum(lastWeekDto.getMonthNum());
        festivalDo.setWeekNum(lastWeekDto.getWeekNum());
        festivalDao.insertSelective(festivalDo);
        FestivalDo fDo = festivalDao.selectByName(lastWeekDto.getName());
        if (Objects.isNull(fDo)) {
            return false;
        }
        List<FestivalTimeDo> festivalTimeDos = Lists.newArrayList();
        //获取当前年
        Calendar rightNow = Calendar.getInstance();
        int year = rightNow.get(Calendar.YEAR);// 获取当前年份
        for (int i=0;i<50;i++) {
            Date result = getSundayFestival(year + i, lastWeekDto.getMonthNum() - 1, lastWeekDto.getWeekNum());
            if (result == null) {
                break;
            }
            FestivalTimeDo festivalTimeDo = new FestivalTimeDo();
            festivalTimeDo.setFestivalId(fDo.getId());
            festivalTimeDo.setStatus(1);
            festivalTimeDo.setTime(result);
            festivalTimeDos.add(festivalTimeDo);
        }
        log.info("[LastWeekFestivalFactoryImpl]festivalTimeDos:{}", JSON.toJSONString(festivalTimeDos));
        if (CollectionUtils.isNotEmpty(festivalTimeDos)) {
            festivalTimeDao.batchInsert(festivalTimeDos);
        }
        return true;
    }

    /**
     * 最后一周周几的节日
     * @param year
     * @param month
     * @param weekNum 周几
     */
    private Date getSundayFestival(int year, int month, int weekNum) {
        //获取当前年的第一天
        String dateStr = year+"-"+month+"-"+01;
        Date date = null;
        Date result = null;
        try {
            date = DateUtils.parseDate(dateStr, "yyyy-MM-dd");
        } catch (Exception e) {
            return date;
        }
        Calendar d = Calendar.getInstance();
        d.setTime(date);
        d.set(d.MONTH, month);
        switch (weekNum) {
                case 7://周日
                    d.set(d.DAY_OF_WEEK, d.SUNDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;
                case 1://周一
                    d.set(d.DAY_OF_WEEK, d.MONDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;

                case 2://周二
                    d.set(d.DAY_OF_WEEK, d.TUESDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;

                case 3://周三
                    d.set(d.DAY_OF_WEEK, d.WEDNESDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;

                case 4://周四
                    d.set(d.DAY_OF_WEEK, d.THURSDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;

                case 5://周五
                    d.set(d.DAY_OF_WEEK, d.FRIDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;

                case 6://周六
                    d.set(d.DAY_OF_WEEK, d.SATURDAY);
                    d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
                    while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
                        d.add(d.WEEK_OF_MONTH, -1);
                    }
                    result = d.getTime();
                    break;
                default:
                    break;
            }
            return result;
        }

    }

最终效果

在这里插入图片描述

有问题私信。。。。。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值