JAVA 判断某个日期是否为工作日

目录

1.使用第三方接口

 1.1.使用http://tool.bitefu.net/jiari

 1.2.使用百度日历

2.数据库建数据表,手动维护表内容


1.使用第三方接口

        优点:代码量小,缺点:第三方服务关闭导致自己的功能不可用

 1.1.使用http://tool.bitefu.net/jiari

public BaseResult<Boolean> isHoliday(LocalDate localDate) {
        log.info("isHoliday_param={}", localDate);
        //示例:http://tool.bitefu.net/jiari/?d=2021-09-19
        //注意:第三方api,该链接有可能失效
        //返回值:0 上班 1周末 2节假日
        try {
            RestTemplate restTemplate = new RestTemplate();
            String httpUrl = "http://tool.bitefu.net/jiari/?d=" + localDate;
            Integer result = restTemplate.getForObject(httpUrl, Integer.class);
            log.info("isHoliday_result={}", JSONUtil.toJsonStr(result));
            return BaseResult.ok(0 == result);
        } catch (Exception e) {
            log.error("isHoliday_error!", e);
            if (DayOfWeek.SATURDAY.equals(localDate.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(localDate.getDayOfWeek())) {
                return BaseResult.ok(Boolean.FALSE);
            }
            return BaseResult.ok(Boolean.TRUE);
        }

    }

1.2.使用百度日历

//万年历
@Builder
@Data
public class BaiduAlmanacInfo {
    /**
     * 生肖
     */
    private String animal;

    /**
     * 忌讳
     */
    private String avoid;

    /**
     * 天
     */
    private String day;

    /**
     * 月份
     */
    private String month;

    /**
     * 日期
     */
    private String oDate;

    /**
     * 年份
     */
    private String year;

    /**
     * 适宜
     */
    private String suit;

    /**
     * 状态
     * 1:代表休息
     * 2:代表补休
     */
    private Integer status;

    /**
     * 影响天数,包含补班天数
     */
    private Integer num;

    /**
     * 周六日
     */
    private String cnDay;
}

/**
     * 获取对应的年月份周围的日历信息
     *
     * @return
     */
    public Boolean queryAlmanacs(LocalDate localDate) {
        log.info("queryAlmanacs_param={}", localDate);
        try {
            RestTemplate restTemplate = new RestTemplate();
            String year = String.valueOf(localDate.getYear());
            String month = String.valueOf(localDate.getMonthValue());
            String day = String.valueOf(localDate.getDayOfMonth());
            String url = "http://opendata.baidu.com/api.php?query=" + year + "年" + month + "月&resource_id=39043&format=json&tn=wisetpl";
            JSONObject result = JSONObject.parseObject(restTemplate.getForObject(url, String.class));
            log.info("queryAlmanacs_result={}", JSONUtil.toJsonStr(result));
            List<BaiduAlmanacInfo> almanacs = resolveAlmanac(result);
            for (BaiduAlmanacInfo oldAlmanac : almanacs) {
                //状态等于1为节假日,等于2为补班
                if (year.equals(oldAlmanac.getYear()) && month.equals(oldAlmanac.getMonth()) && day.equals(oldAlmanac.getDay())) {
                    if (oldAlmanac.getStatus() == null) {
                        return "六".equals(oldAlmanac.getCnDay()) || "日".equals(oldAlmanac.getCnDay()) ? Boolean.TRUE : Boolean.FALSE;
                    } else {
                        return 1 == oldAlmanac.getStatus() ? Boolean.FALSE : Boolean.TRUE;
                    }
                }
            }
            return Boolean.FALSE;
        } catch (Exception e) {
            log.error("queryAlmanacs_error!", e);
            if (!DayOfWeek.SATURDAY.equals(localDate.getDayOfWeek()) && !DayOfWeek.SUNDAY.equals(localDate.getDayOfWeek())) {
                return Boolean.TRUE;
            }
            return Boolean.FALSE;
        }

    }


    /**
     * 解析百度日历接口返回的json对象
     *
     * @param jsonObject
     * @return
     */
    private List<BaiduAlmanacInfo> resolveAlmanac(JSONObject jsonObject) {
        List<BaiduAlmanacInfo> almanacs = new ArrayList<>();

        try {
            if ("0".equalsIgnoreCase(jsonObject.getString("status"))) {
                JSONArray data = jsonObject.getJSONArray("data");
                if (!CollectionUtils.isEmpty(data)) {
                    JSONObject item = data.getJSONObject(0);
                    if (item == null || item.get("almanac") == null) {
                        return almanacs;
                    }
                    JSONArray jsonArray = item.getJSONArray("almanac");
                    if (!CollectionUtils.isEmpty(jsonArray)) {
                        for (int i = 0; i < jsonArray.size(); i++) {
                            JSONObject h = jsonArray.getJSONObject(i);
                            String animalStr = h.getString("animal");
                            String avoidStr = h.getString("avoid");
                            String yearStr = h.getString("year");
                            String monthStr = h.getString("month");
                            String dayStr = h.getString("day");
                            String suitStr = h.getString("suit");
                            String statusStr = h.getString("status");
                            // 生成对象
                            BaiduAlmanacInfo almanac = BaiduAlmanacInfo.builder().animal(animalStr).avoid(avoidStr)
                                    .day(dayStr).month(monthStr).year(yearStr).suit(suitStr)
                                    .status(Integer.parseInt(StringUtils.isBlank(statusStr) ? "0" : statusStr)).build();
                            almanacs.add(almanac);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("resolveAlmanac is error");
            throw new RuntimeException(e);
        }

        return almanacs;
    }

2.数据库建数据表,手动维护表内容

CREATE TABLE `calendar_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `calendar_date` varchar(100) DEFAULT NULL COMMENT '日期',
  `calendar_type` int(2) DEFAULT NULL COMMENT '日期类型 0:工作日 1节假日 2补班',
  `cn_day` varchar(100) DEFAULT NULL COMMENT '周六日',
  `calendar_detail` varchar(100) DEFAULT NULL COMMENT '备注',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_upd_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_index_calendar_info` (`calendar_date`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2408 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='日历信息表'
@Data
@TableName("calendar_info")
@Builder
public class CalendarInfo {

    @TableId(value = "id",type = IdType.AUTO)
    private Long id;

    private String calendarDate;

    private Integer calendarType;

    private String calendarDetail;

    private String createTime;

    private String lastUpdTime;

    private String cnDay;
}
public BaseResult<Boolean> isHolidayInfo(LocalDate localDate) {
        log.info("queryAlmanacs_param={}", localDate);
        try {
            CalendarInfo calendarInfo = calendarInfoService.getOne(Wrappers.lambdaQuery(CalendarInfo.class).eq(CalendarInfo::getCalendarDate, localDate));
            if (calendarInfo == null) {
                List<CalendarInfo> resrltCalendarInfos = new ArrayList<>();
                List<Integer> list = Arrays.asList(2, 5, 8, 11);
                list.forEach(o -> {
                    resrltCalendarInfos.addAll(resolveCalendarInfo(String.valueOf(localDate.getYear()), String.valueOf(o)));
                });
                calendarInfoService.saveBatch(resrltCalendarInfos);
                for (CalendarInfo resrltCalendarInfo : resrltCalendarInfos) {
                    if (localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).equals(resrltCalendarInfo.getCalendarDate())) {
                        calendarInfo = resrltCalendarInfo;
                    }
                }
            }
            if (calendarInfo.getCalendarType() == null) {
                return "六".equals(calendarInfo.getCnDay()) || "日".equals(calendarInfo.getCnDay()) ? BaseResult.ok(Boolean.TRUE) : BaseResult.ok(Boolean.FALSE);
            } else {
                return 1 == calendarInfo.getCalendarType() ? BaseResult.ok(Boolean.FALSE) : BaseResult.ok(Boolean.TRUE);
            }

        } catch (Exception e) {
            log.error("isHoliday_error!", e);
            if (DayOfWeek.SATURDAY.equals(localDate.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(localDate.getDayOfWeek())) {
                return BaseResult.ok(Boolean.FALSE);
            }
            return BaseResult.ok(Boolean.TRUE);
        }

    }


private List<CalendarInfo> resolveCalendarInfo(String year, String month) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://opendata.baidu.com/api.php?query=" + year + "年" + month + "月&resource_id=39043&format=json&tn=wisetpl";
        JSONObject result = JSONObject.parseObject(restTemplate.getForObject(url, String.class));
        System.out.println("result = " + result);
        List<CalendarInfo> calendarInfos = new ArrayList<>();
        try {
            if ("0".equalsIgnoreCase(result.getString("status"))) {
                JSONArray data = result.getJSONArray("data");
                if (!CollectionUtils.isEmpty(data)) {
                    JSONObject item = data.getJSONObject(0);
                    if (item == null || item.get("almanac") == null) {
                        return calendarInfos;
                    }
                    JSONArray jsonArray = item.getJSONArray("almanac");
                    if (!CollectionUtils.isEmpty(jsonArray)) {
                        for (int i = 0; i < jsonArray.size(); i++) {
                            JSONObject h = jsonArray.getJSONObject(i);
                            String calendarDate = h.getString("year") + "-" + (h.getInteger("month") > 9 ? h.getString("month") : "0" + h.getString("month")) + "-" + (h.getInteger("day") > 9 ? h.getString("day") : "0" + h.getString("day"));
                            String calendarType = h.getString("status");
                            String calendarDetail = h.getString("term");
                            String cnDay = h.getString("cnDay");
                            // 生成对象
                            CalendarInfo calendarInfo = CalendarInfo.builder().calendarDate(calendarDate).cnDay(cnDay).calendarType(StringUtils.isBlank(calendarType) ? null : Integer.valueOf(calendarType))
                                    .calendarDetail(calendarDetail).build();
                            calendarInfos.add(calendarInfo);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("resolveCalendarInfo is error");
            throw new RuntimeException(e);
        }

        return calendarInfos;
    }

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值