国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java獲取國家法定節(jié)假日(不依賴API)

這篇具有很好參考價值的文章主要介紹了java獲取國家法定節(jié)假日(不依賴API)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java獲取國家法定節(jié)假日, 由此可獲取每月第一個工作日和最后一個工作日

(不依賴API,主要是因為API接口不可靠或計費,此工具依賴國務(wù)院發(fā)布的節(jié)假日基礎(chǔ)信息進(jìn)行解析)

本工具僅供參考學(xué)習(xí)。各類數(shù)據(jù)獲取需遵守法律法規(guī)文章來源地址http://www.zghlxwxcb.cn/news/detail-696833.html

package com.exrate;

import cn.hutool.core.util.NumberUtil;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Q
 */
public class ChinaHolidaysUtils {
    /**
     * 國務(wù)院發(fā)布的節(jié)假日安排的通知 保存的文件路徑
     */
    private static final String HOLIDAY_NOTICES_FILE_PATH = ChinaHolidaysUtils.class.getResource("/").getPath()+"國務(wù)院發(fā)布的節(jié)假日安排的通知/";
    /**
     * 國務(wù)院文件搜索地址
     */
    private static final String GOV_URL = "http://sousuo.gov.cn/s.htm?t=paper&advance=false&n=10&timetype=timeqb&mintime=&maxtime=&sort=pubtime&q=%E8%8A%82%E5%81%87%E6%97%A5%E5%AE%89%E6%8E%92%E7%9A%84%E9%80%9A%E7%9F%A5";

    private static Set<String> publicHolidays = new ConcurrentSkipListSet<>();
    private static Set<String> oxenHorseDays = new ConcurrentSkipListSet<>();

    public static void main(String[] args) {
        try {
            System.out.println(isOxenHorseDays(LocalDate.now().toString()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("publicHolidays: " + publicHolidays);
        System.out.println("oxenHorseDays: " + oxenHorseDays);
    }

    /**
     * 是否為調(diào)休補班日
     * @param localDate
     * @return
     * @throws IOException
     */
    public static boolean isOxenHorseDays(String localDate) throws IOException {
        if(oxenHorseDays.isEmpty()){
            getDays(localDate, publicHolidays, oxenHorseDays);
        }
        return oxenHorseDays.contains(localDate);
    }

    /**
     * 是否為法定節(jié)假日
     * @param localDate
     * @return
     * @throws IOException
     */
    public static boolean isPublicHolidays(String localDate) throws IOException {
        if(publicHolidays.isEmpty()){
            getDays(localDate, publicHolidays, oxenHorseDays);
        }
        return publicHolidays.contains(localDate);
    }

    private static synchronized void getDays(String localDate, Set<String> publicHolidays, Set<String> oxenHorseDays) throws IOException {
        //獲取xxx年的節(jié)假日數(shù)據(jù)
        String year = null;
        if(StringUtils.isEmpty(localDate)){
            year = String.valueOf(LocalDate.parse(localDate).getYear());
        }else{
            year = String.valueOf(LocalDate.now().getYear());
        }
        //先通過緩存文件,否則使用http獲取
        String html = getHtmlByCacheFiles(year);
        if(html == null){
            html = getHtmlByHttp(year);
        }
        Document doc = Jsoup.parse(html);
        Element content = doc.select("div.b12c.pages_content").first();
        Elements paragraphs = content.select("p");
        for (Element p : paragraphs) {
            String text = p.text();
            if (text.contains("、") && text.contains(":") && text.contains("。") && text.contains("放假")) {
                text = text.substring(text.indexOf(":")+1);
                String[] sentences = text.split("。");
                for (String sentence : sentences) {
                    if (sentence.contains("放假")) {
                        String t = sentence.split("放假")[0];
                        if (t.contains("至")) {
                            String start = t.split("至")[0];
                            String startDay=null, startMonth=null, startYear=null;
                            if(start.contains("日") || start.contains("月") || start.contains("年")){
                                startDay = getDigit(start, "日");
                                startMonth = getDigit(start, "月");
                                startYear = getDigit(start, "年");
                            }
                            LocalDate startDate = parseDate(startYear==null?year:startYear, startMonth, startDay);
                            String end = t.split("至")[1];
                            String endDay=null, endMonth=null, endYear=null;
                            if(end.contains("日") || end.contains("月") || end.contains("年")){
                                endDay = getDigit(end, "日");
                                endMonth = getDigit(end, "月");
                                endYear = getDigit(end, "年");
                            }
                            LocalDate endDate = parseDate(endYear==null?(startYear==null?year:startYear):endYear, endMonth==null?startMonth:endMonth, endDay);
                            for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
                                publicHolidays.add(date.toString());
                            }
                        } else {
                            String tDay=null, tMonth=null, tYear=null;
                            if(t.contains("日") || t.contains("月") || t.contains("年")){
                                tDay = getDigit(t, "日");
                                tMonth = getDigit(t, "月");
                                tYear = getDigit(t, "年");
                            }
                            LocalDate date = parseDate(tYear==null? year:tYear, tMonth, tDay);
                            publicHolidays.add(date.toString());
                        }
                    }
                    if (sentence.contains("上班")) {
                        String t = sentence.split("上班")[0];
                        if (sentence.contains("、")) {
                            String[] dates = sentence.split("、");
                            for (String dateStr : dates) {
                                String tDay=null, tMonth=null, tYear=null;
                                if(dateStr.contains("日") || dateStr.contains("月") || dateStr.contains("年")){
                                    tDay = getDigit(dateStr, "日");
                                    tMonth = getDigit(dateStr, "月");
                                    tYear = getDigit(dateStr, "年");
                                }
                                LocalDate date = parseDate(tYear==null? year:tYear, tMonth, tDay);
                                oxenHorseDays.add(date.toString());
                            }
                        }else{
                            String tDay=null, tMonth=null, tYear=null;
                            if(t.contains("日") || t.contains("月") || t.contains("年")){
                                tDay = getDigit(t, "日");
                                tMonth = getDigit(t, "月");
                                tYear = getDigit(t, "年");
                            }
                            LocalDate date = parseDate(tYear==null? year:tYear, tMonth, tDay);
                            oxenHorseDays.add(date.toString());
                        }
                    }
                }
            }
        }
    }

    /**
     * 模擬人為操作的參數(shù)
     * @param url
     */
    private static Request getRequestSetUnifiedHead(String url){
        Request.Builder builder = new Request.Builder();
        builder.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
               .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
               .header("Host", "www.gov.cn")
               .header("Referer", "http://sousuo.gov.cn/")
//             .header("Accept-Encoding", "gzip, deflate, br") 造成亂碼問題
               .header("Accept-Language", "zh-CN,zh;q=0.9")
               .header("Cache-Control", "max-age=0")
               .header("Connection", "keep-alive")
               .header("Sec-Fetch-Dest", "document")
               .header("Sec-Fetch-Mode", "navigate")
               .header("Sec-Fetch-Site", "cross-site")
               .header("Sec-Fetch-User", "?1")
               .header("Upgrade-Insecure-Requests", "1")
               .header("sec-ch-ua", "\"Not.A/Brand\";v=\"8\", \"Chromium\";v=\"114\", \"Google Chrome\";v=\"114\"")
               .header("sec-ch-ua-mobile", "?0")
               .header("sec-ch-ua-platform", "Windows");
        return builder.url(url).build();
    }

    /**
     * http get請求
     * @param client
     * @param url
     * @return
     * @throws IOException
     */
    private static String httpGet(OkHttpClient client, String url) throws IOException {
        Request request = getRequestSetUnifiedHead(url);
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            throw new IOException("獲取數(shù)據(jù)失?。? + url);
        }
        String html = response.body().string();
        System.out.println("進(jìn)行了一次http get請求:" + url);
        return html;
    }
    /**
     * 通過http獲取國務(wù)院發(fā)布xxxx年的節(jié)假日安排的通知
     * @return
     * @throws IOException
     */
    private static String getHtmlByHttp(String year) throws IOException {
        OkHttpClient client = new OkHttpClient();
        String html = httpGet(client, GOV_URL);
        Document doc = Jsoup.parse(html);
        Elements resList = doc.select("li.res-list");
        if (!resList.isEmpty()) {
            Optional<Element> optional = resList.stream().filter(res -> res.text().contains("國務(wù)院辦公廳關(guān)于"+year+"年")).findFirst();
            if (!optional.isPresent()) {
                throw new IOException("未獲取到"+ year +"年節(jié)假日安排的通知:" + GOV_URL);
            }
            Element element = optional.get();
            String linkUrl = element.select("a[href]").attr("abs:href");
            html = httpGet(client, linkUrl);
            str2File(html, HOLIDAY_NOTICES_FILE_PATH, year+"節(jié)假日安排的通知-源數(shù)據(jù)", ".html");
            Document resDoc = Jsoup.parse(html);
            str2File(html, HOLIDAY_NOTICES_FILE_PATH, resDoc.title(), ".html");
            return html;
        }
        return null;
    }

    /**
     * 先通過緩存節(jié)假日通知的指定目錄中獲取 當(dāng)年的 節(jié)假日通知文件
     * @param year
     * @return
     */
    private static String getHtmlByCacheFiles(String year) {
        String[] paths = new File(HOLIDAY_NOTICES_FILE_PATH).list();
        if(paths != null && paths.length > 0){
            Optional<String> yearPath = Arrays.stream(paths).filter(p -> p.contains(year)).findFirst();
            if (yearPath.isPresent()){
                return file2Str(HOLIDAY_NOTICES_FILE_PATH + yearPath.get());
            }
        }
        return null;
    }


    /**
     * 根據(jù)年月日字符轉(zhuǎn)為 yyyy-M-d 格式的LocalDate
     * @param year
     * @param month
     * @param day
     * @return
     */
    private static LocalDate parseDate(String year, String month, String day) {
        String dateStr = year + "-" + month + "-" + day;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");
        return LocalDate.parse(dateStr, formatter);
    }

    /**
     * 將字符串內(nèi)容轉(zhuǎn)為文件存到指定路徑下
     * @param str
     * @param filePath
     */
    public static void str2File(String str, String filePath, String fileName, String fileSuffix) throws IOException {
        File file = new File(filePath + fileName + fileSuffix);
        if (!file.getParentFile().exists()) {
            boolean created = file.getParentFile().mkdirs();
            if (!created) {
                throw new IOException("文件路徑創(chuàng)建失敗");
            }
        }
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 將指定路徑的文件轉(zhuǎn)為字符串
     * @param filePath
     * @return
     */
    private static String file2Str(String filePath) {
        File file = new File(filePath);
        try (FileReader reader = new FileReader(file)) {
            char[] buffer = new char[(int) file.length()];
            reader.read(buffer);
            return new String(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 獲取指定字符串前的數(shù)字
     */
    private static final Pattern PATTERN = Pattern.compile("[^\\d]");
    private static String getDigit(String content, String targetStr) {
        if(!content.contains(targetStr)){
            return null;
        }
        content = content.substring(0, content.indexOf(targetStr));
        StringBuffer sb = new StringBuffer(content);
        content = sb.reverse().toString();
        //使用正則表達(dá)式匹配第一個非數(shù)字
        Matcher matcher = PATTERN.matcher(content);
        if (matcher.find()) {
            content = content.substring(0, matcher.start());
            sb = new StringBuffer(content);
            return sb.reverse().toString();
        }
        //是否為數(shù)字
        if(NumberUtil.isNumber(content)){
            return new StringBuffer(content).reverse().toString();
        }
        return null;
    }


}

到了這里,關(guān)于java獲取國家法定節(jié)假日(不依賴API)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 「日歷訂閱」全網(wǎng)首發(fā)2023年中國法定節(jié)假日

    「日歷訂閱」全網(wǎng)首發(fā)2023年中國法定節(jié)假日

    眾所周知Mac的日歷只會顯示中國的節(jié)假日,而不會顯示中國的法定節(jié)假日,今天仲輝就分享下自己DIY的2023年中國法定節(jié)假日(含補班),按照此方法您還可以為他(她)制作一份帶生日提醒的日歷,這樣不用開口禮物就到手了(手動狗頭)。 需要用的軟件及工具: 1、日歷;

    2024年02月06日
    瀏覽(18)
  • 基于Anylogic仿真系統(tǒng)的節(jié)假日城市軌道交通大客流優(yōu)化—以春熙路地鐵站為例

    基于Anylogic仿真系統(tǒng)的節(jié)假日城市軌道交通大客流優(yōu)化—以春熙路地鐵站為例

    目 錄 1緒論 1 1.1研究背景與意義 1 1.2國內(nèi)外研究現(xiàn)狀 1 1.2.1國外研究現(xiàn)狀 1 1.2.2國內(nèi)研究現(xiàn)狀 2 1.3研究內(nèi)容 2 2春熙路地鐵站交通特性分析 4 2.1車站布局分析 4 2.1.1春熙路站概況 4 2.1.2站廳層設(shè)施布局分析 4 2.1.3站臺層設(shè)施布局分析 5 2.2車站運營流程分析 6 2.2.1乘客進(jìn)出站流程 6

    2024年02月02日
    瀏覽(37)
  • 查詢法定工作日的API接口

    查詢法定工作日的API接口

    ? 在現(xiàn)代社會中,時間的規(guī)劃和安排對于個人和企業(yè)來說非常重要。在我們處理時間上的事務(wù)時,我們需要知道某一天是否是國家法定節(jié)假日或者法定工作日。因此,開發(fā)一個能夠查詢特定日期的法定工作日的API接口就變得非常有必要了。 一、功能說明 該API接口的主要功能

    2024年01月20日
    瀏覽(19)
  • 【196】JAVA8 用 DOM 方式的 API 解析XML文件,無需引入第三方依賴。

    JAVA8 可以使用標(biāo)準(zhǔn)的 DOM 方式的 API 來編寫代碼解析 XML 文件,無需引入第三方依賴。下面是兩個測試用的 XML 文件: test.xml test2.xml 負(fù)責(zé)接收所有信息的 AllDataDTO.java 負(fù)責(zé)接收用戶信息的 AllDataUserDTO.java 處理 XML 文件的工具類,XmlUtils.java 用于測試效果的類 Main.java 輸出結(jié)果:

    2024年01月22日
    瀏覽(25)
  • Nginx通過用戶IP獲取所在國家及地理位置

    Nginx通過用戶IP獲取所在國家及地理位置

    Nginx是一款高性能、輕量級的Web服務(wù)器和反向代理服務(wù)器。它最初設(shè)計目的是為了解決C10k問題,即如何支持10,000個以上的并發(fā)連接。Nginx采用了事件驅(qū)動的異步非阻塞模型,可以在消耗較少的系統(tǒng)資源下處理更多的并發(fā)連接。由于其高性能和可靠性,Nginx逐漸成為了現(xiàn)代Web架構(gòu)

    2024年02月09日
    瀏覽(31)
  • Java調(diào)用高德地圖API根據(jù)詳細(xì)地址獲取經(jīng)緯度

    Java調(diào)用高德地圖API根據(jù)詳細(xì)地址獲取經(jīng)緯度

    訪問高德開放平臺https://lbs.amap.com/ 登錄后,在控制臺中創(chuàng)建一個應(yīng)用,獲取生成的應(yīng)用key。這個key將用于訪問高德地圖API。 ? 您可以使用Java中的 HttpURLConnection 或 HttpClient 等工具發(fā)送HTTP請求到高德地圖API,并傳遞參數(shù)以獲取經(jīng)緯度信息。以下是一個使用 HttpURLConnection 的示例

    2024年02月05日
    瀏覽(161)
  • php獲取客戶端ip地址及ip所在國家、省份、城市、縣區(qū)

    獲取客戶端ip地址,然后使用這個ip地址獲取所在的國家、省份、城市,可以在網(wǎng)站中實現(xiàn)IP屬地,發(fā)布地等功能。 本文的獲取IP地址信息均采自網(wǎng)絡(luò)上免費的IP查詢網(wǎng)站,通過其API或者網(wǎng)頁HTML解析出的ip地址信息。 https://域名/getipInfo.php?ip=需要查詢的IP地址 一共有5個接口,接

    2024年02月09日
    瀏覽(21)
  • [JAVA版本] 最新websocket獲取B站直播彈幕——非官方API

    如果只想要代碼實現(xiàn),直接看第二部分。 fastjson2用于解析JSON字符串 ,可自行替換成別的框架。 hutool-core用于解壓zip數(shù)據(jù) ,可自行替換成別的框架。 2023年9月B站如果不登錄,獲取到的彈幕消息是經(jīng)過脫敏的,獲取不到用戶名和用戶ID。 獲取方式: 電腦瀏覽器登錄B站,按F1

    2024年02月19日
    瀏覽(20)
  • HBase開發(fā): Java API 管理表 第1關(guān):JavaAPI獲取表的列表

    本關(guān)我們來使用 JavaApi 對 HBase 中的表進(jìn)行管理,第一關(guān)我們來學(xué)習(xí)如何列出所有的表。 獲取表的列表 如何使用 Java 列出 HBase 中所有的表呢? 在HBase中我們要獲取一張表的基本信息需要用到一個類: TableDescriptor ; 通過 TableDescriptor 我們可以獲取表的名字,列族等信息; 好了

    2024年02月07日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包