Java后端获取日历信息

记录项目中获取日历的代码,仅Java后端,前端页面展示确实不会。需求是只能在本年度初始下一年度日历信息,具体需要初始化的信息都在实体类里。如有错误或不适当的地方请大佬指正。
ps:以下用到了hutool工具包,依赖可去官网贴,获取日历的需要5.4.1以上版本。

1.实体类

@Data
@TableName("pz_work_days")
public class PzWorkDaysEntity implements Serializable {

    @TableId(type = IdType.UUID)
    private String id;

    /**
     *年份
     */
    private int yearNum;

    /**
     * 月份
     */
    private int monthNum;

    /**
     * 日期
     */
    private String workDay;

    /**
     * 生肖
     */
    private String zodiac;

    /**
     *甲子年
     */
    private String sixtyYear;

    /**
     *甲子月
     */
    private String sixtyMonth;

    /**
     *甲子日
     */
    private String sixtyDay;

    /**
     *农历日
     */
    private String chineseDay;

    /**
     *周数
     */
    private int weekNum;

    /**
     *星期
     */
    private char weekDay;

    /**
     *节日名称
     */
    private String festivalName;

    /**
     *是否工作日
     */
    private char isWeekday;

    /**
     *备注
     */
    private String remarks;

    /**
     *操作人
     */
    private String operateUser;

    /**
     *操作时间
     */
    private Date operateTime;

    /**
     * 日期 用于排序
     */
    @TableField(exist = false)
    private int day;

    /**
     * 假日类型0-普通1-法定2-集中
     */
    private String holidayType;
}

2.service层

/**
     * 初始化下一年度每月日历
     */
    public List<PzWorkDaysEntity> refreshDate(){
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR) + 1;
        List<HolidayVo> holidays = this.getHolidays(year);
        List<PzWorkDaysEntity> list = new ArrayList<>();
        SysUserEntity user = (SysUserEntity) ShiroUtils.getSubject().getPrincipal();
        for (int month = 1; month < 13; month++) {
            //实例化两个日历对象,一个设置为1900/1/1 一个设置为你要查询的日期
            Calendar calendar1 = Calendar.getInstance();
            Calendar calendar2 = Calendar.getInstance();

            calendar1.set(year, month, 1);
            calendar2.set(1900, 1, 1);
            //月份从0开始
            calendar1.set(Calendar.MONTH, month - 1);
            int day = getDaysBetween(calendar1, calendar2);
            //将天数差%7得到当前月份第一天是星期几
            day %= 7;
            //如果day%7==0,表示当前月份第一天是星期日
            if (day == 0) {
                day = 7;
            }
            int weekNum = 0;
            //getActualMaximum 获得该月份中天数的最大值
            for (int i = 1; i <= calendar1.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
                PzWorkDaysEntity pzWorkDaysEntity = new PzWorkDaysEntity();
                pzWorkDaysEntity.setYearNum(year);
                pzWorkDaysEntity.setMonthNum(month);
                pzWorkDaysEntity.setWorkDay(i+"");
                switch ((i+day-1)%7){
                    case  0 :
                        pzWorkDaysEntity.setWeekDay('0');
                        break;
                    case  1:
                        pzWorkDaysEntity.setWeekDay('1');
                        break;
                    case  2:
                        pzWorkDaysEntity.setWeekDay('2');
                        break;
                    case  3:
                        pzWorkDaysEntity.setWeekDay('3');
                        break;
                    case  4:
                        pzWorkDaysEntity.setWeekDay('4');
                        break;
                    case  5:
                        pzWorkDaysEntity.setWeekDay('5');
                        break;
                    case  6:
                        pzWorkDaysEntity.setWeekDay('6');
                        break;
                }


                //获取一个Calendar对象
                Calendar calendar3 = Calendar.getInstance();
                String today = year + "-" + month + "-" + i;
                //设置星期一为一周开始的第一天
                calendar3.setFirstDayOfWeek(Calendar.MONDAY);
                calendar3.setTime(DateUtil.parseDate(today));
                //获得当前日期属于今年的第几周
                int weekOfYear = calendar3.get(Calendar.WEEK_OF_YEAR);
                ChineseDate date = new ChineseDate(DateUtil.parseDate(today));

                String cyclicalYMD = date.getCyclicalYMD();
                char[] chars = cyclicalYMD.toCharArray();
                pzWorkDaysEntity.setZodiac(date.getChineseZodiac());
                pzWorkDaysEntity.setSixtyYear(date.getCyclical());
                pzWorkDaysEntity.setChineseDay(date.getChineseMonth()+""+date.getChineseDay());
                pzWorkDaysEntity.setWeekNum(weekOfYear);
                pzWorkDaysEntity.setFestivalName(date.getFestivals());
                pzWorkDaysEntity.setSixtyMonth(chars[3]+""+chars[4]);
                pzWorkDaysEntity.setSixtyDay(chars[6]+""+chars[7]);
                //判断当天是否为节假日
                List<HolidayVo> collect = holidays.stream().filter(l -> l.getStartday().equals(today)).collect(Collectors.toList());
                //默认双休和法定节假日为休息日,其他均为工作日
                if (!collect.isEmpty()){
                    //此处由于hutool请求到的节假日为农历,元旦等节日无法请求到。
                    pzWorkDaysEntity.setFestivalName(collect.get(0).getName());
                    pzWorkDaysEntity.setIsWeekday('否');
                    pzWorkDaysEntity.setHolidayType("1");
                }else {
                    if (pzWorkDaysEntity.getWeekDay() == '6' || pzWorkDaysEntity.getWeekDay() == '0'){
                        pzWorkDaysEntity.setIsWeekday('否');
                        pzWorkDaysEntity.setHolidayType("0");
                    }else {
                        pzWorkDaysEntity.setIsWeekday('是');
                    }
                }
                pzWorkDaysEntity.setOperateUser(user.getRealName());
                pzWorkDaysEntity.setOperateTime(new Date());
                list.add(pzWorkDaysEntity);
            }
        }
        return list;
    }


    /**
     * 获得两个日期间天数差
     * @param day1	日期1   用户查询日期
     * @param day2	日期2 1900/1/1
     * @return 天数差
     */
    public static int getDaysBetween(Calendar day1,Calendar day2){
        //得到当前时间在一年中的天数
        int days = day1.get(Calendar.DAY_OF_YEAR);
        //获取年
        int y1 = day1.get(Calendar.YEAR);
        //计算1900/1/1日 与 y1/1/1日的天数差
        if(day2.get(Calendar.YEAR) != y1){
            day2 = (Calendar)day2.clone();
            do{
                days += day2.getActualMaximum(Calendar.DAY_OF_YEAR);
                day2.add(Calendar.YEAR, 1);
            }while(day2.get(Calendar.YEAR) != y1);
        }
        return days;
    }


    /**
     * https://docs.topthink.com/think-api
     * @param year 年份
     * @return
     */
    public List<HolidayVo> getHolidays(int year){
        //appcode在以下网址申请
        String appCode = "";
        String url = "https://api.topthink.com/calendar/year";
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("appCode",appCode);
        paramMap.put("year",year);
        String result = HttpUtil.get(url, paramMap);
        JSONObject jsonObject = JSONObject.parseObject(result);
        List<HolidayVo> list = JSON.parseArray(JSONObject.parseObject(jsonObject.getString("data")).getString("holiday_list"), HolidayVo.class);
        return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值