java节假日爬虫(接口调用失败:默认取所有周末的日期)



import org.springframework.web.client.RestTemplate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 节假日爬虫(接口调用失败:默认取所有周末的日期)
 */
public class HolidayCrawler {


    private static final String YEAR_HOLIDAY_URL = "https://api.apihubs.cn/holiday/get?field=date,weekend&year=";
    private static final String YEAR_HOLIDAY_PARAMS = "&workday=2&order_by=1&cn=1&page=1&size=500";

    /**
     * http请求工具类
     */
    private static final RestTemplate REST_TEMPLATE = new RestTemplate();

    /**
     * 获取指定年份节假日
     * @param year
     * @return
     */
    public static List<String> initHolidays(String year){
        List<String> Holidays = new ArrayList<>();
        try {
            long ts = System.currentTimeMillis();
            Map<String,Object> result = REST_TEMPLATE.getForObject(String.format(YEAR_HOLIDAY_URL+ year + YEAR_HOLIDAY_PARAMS, ts, ts), Map.class);
            if(null != result){
                String code = String.valueOf(result.get("code"));
                String msg = String.valueOf(result.get("msg"));
                if(code.equals("0") && msg.equals("ok")){
                    Map data = (Map) result.get("data");
                    if(null != data){
                        List<Map<String,Object>> list = (List<Map<String, Object>>) data.get("list");
                        for (Map<String,Object> d : list){
                            String date = d.get("date").toString();
                            String formatDate = date.substring(0, 4)+"-"+date.substring(4, 6)+"-"+date.substring(6, 8);
                            Holidays.add(formatDate);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (Holidays.isEmpty()) {
            Holidays = getWeekdays(Integer.parseInt(year));
        }
        return Holidays;
    }

    /**
     * 获取指定年份的所有周末日期
     * @param year 年份
     */
    public  static List<String> getWeekdays(int year){
        List<String> dateList= new ArrayList<>();
        SimpleDateFormat simdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = new GregorianCalendar(year, 0, 1);
        int i = 1;
        while (calendar.get(Calendar.YEAR) < year + 1) {
            calendar.set(Calendar.WEEK_OF_YEAR, i++);
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
            if (calendar.get(Calendar.YEAR) == year) {
                dateList.add(simdf.format(calendar.getTime()));
            }
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
            if (calendar.get(Calendar.YEAR) == year) {
                dateList.add(simdf.format(calendar.getTime()));
            }
        }
        return dateList;
    }

    /**
     * 日期范围 - 切片
     *
     * @param startDate 起始日期
     * @param endDate   结束日期
     * @param type      切片类型 1年  2月  3日  4小时
     * @return 切片日期
     */
    public static List<String> sliceUpDateRange(String startDate, String endDate, int type) {
        List<String> rs = new ArrayList<>();

        try {
            int dt = Calendar.DATE;
            String pattern = "yyyy-MM-dd";
            if (type == 1) {
                pattern = "yyyy";
                dt = Calendar.YEAR;
            } else if (type == 2) {
                pattern = "yyyy-MM";
                dt = Calendar.MONTH;
            } else if (type == 3) {
                pattern = "yyyy-MM-dd";
                dt = Calendar.DATE;
            } else if (type == 4) {
                pattern = "yyyy-MM-dd HH";
                dt = Calendar.HOUR_OF_DAY;
            }
            SimpleDateFormat sd = new SimpleDateFormat(pattern);
            Calendar sc = Calendar.getInstance();
            Calendar ec = Calendar.getInstance();
            sc.setTime(sd.parse(startDate));
            ec.setTime(sd.parse(endDate));
            while (sc.compareTo(ec) < 1) {
                rs.add(sd.format(sc.getTime()));
                sc.add(dt, 1);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return rs;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jilke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值