国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于 Java 的工作日與節假日智能識別

開發
在企業級應用開發中,經常需要判斷某個日期是否為工作日或節假日,例如考勤系統、任務調度系統、銀行交易系統等,來看看以下方案。

前言

在企業級應用開發中,經常需要判斷某個日期是否為工作日或節假日,例如考勤系統、任務調度系統、銀行交易系統等。

效果圖

圖片

基礎實現方案

最基礎的方案是使用Java內置的日期時間API,結合簡單的周末判斷邏輯:

public class HolidayUtil {
    
    // 法定節假日集合
    private static final Set<LocalDate> HOLIDAYS = new HashSet<>();
    
    // 調休工作日集合(周末調休為工作日)
    private static final Set<LocalDate> ADJUSTED_WORKDAYS = new HashSet<>();
    
    static {
        // 初始化法定節假日
        HOLIDAYS.add(LocalDate.of(2025, 1, 1));  // 元旦
        HOLIDAYS.add(LocalDate.of(2025, 1, 28)); // 除夕
        
        // 初始化調休工作日
        HOLIDAYS.add(LocalDate.of(2025, 1, 26));  // 春節前補班
        HOLIDAYS.add(LocalDate.of(2025, 2, 8));  // 春節后補班
    }
    
    /**
     * 判斷日期是否為工作日
     */
    public static boolean isWeekday(LocalDate date) {
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY;
    }
    
    /**
     * 判斷日期是否為法定節假日
     */
    public static boolean isHoliday(LocalDate date) {
        return HOLIDAYS.contains(date);
    }
    
    /**
     * 判斷日期是否為調休工作日
     */
    public static boolean isAdjustedWorkday(LocalDate date) {
        return ADJUSTED_WORKDAYS.contains(date);
    }
    
    /**
     * 判斷日期是否為需要上班的日子(工作日或調休工作日)
     */
    public static boolean isWorkingDay(LocalDate date) {
        // 如果是法定節假日,不是工作日
        if (isHoliday(date)) {
            returnfalse;
        }
        
        // 如果是調休工作日,是工作日
        if (isAdjustedWorkday(date)) {
            returntrue;
        }
        
        // 否則根據周幾判斷
        return isWeekday(date);
    }
    
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 2, 5); // 春節
        System.out.println(date + " 是否為工作日: " + isWorkingDay(date));
        
        date = LocalDate.of(2025, 1, 26); // 春節調休
        System.out.println(date + " 是否為工作日: " + isWorkingDay(date));
        
        date = LocalDate.of(2025, 7, 5); // 周日
        System.out.println(date + " 是否為工作日: " + isWorkingDay(date));
    }
}

基于外部數據源的方案

基礎方案的局限性在于節假日數據需要硬編碼在代碼中,不利于維護和更新。更靈活的方案是將節假日數據存儲在外部文件或數據庫中:

public class HolidayUtil {
    
    private static final String HOLIDAY_FILE = "holidays.txt";
    private static final String ADJUSTED_WORKDAY_FILE = "adjusted_workdays.txt";
    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    
    private final Set<LocalDate> holidays = new HashSet<>();
    private final Set<LocalDate> adjustedWorkdays = new HashSet<>();
    
    public HolidayUtil() {
        loadHolidays();
        loadAdjustedWorkdays();
    }
    
    private void loadHolidays() {
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(Objects.requireNonNull(
                        getClass().getClassLoader().getResourceAsStream(HOLIDAY_FILE))))) {
            reader.lines()
                  .map(line -> line.trim())
                  .filter(line -> !line.isEmpty() && !line.startsWith("#"))
                  .map(dateStr -> LocalDate.parse(dateStr, DATE_FORMAT))
                  .forEach(holidays::add);
        } catch (IOException e) {
            System.err.println("加載節假日數據失敗: " + e.getMessage());
        }
    }
    
    private void loadAdjustedWorkdays() {
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(Objects.requireNonNull(
                        getClass().getClassLoader().getResourceAsStream(ADJUSTED_WORKDAY_FILE))))) {
            reader.lines()
                  .map(line -> line.trim())
                  .filter(line -> !line.isEmpty() && !line.startsWith("#"))
                  .map(dateStr -> LocalDate.parse(dateStr, DATE_FORMAT))
                  .forEach(adjustedWorkdays::add);
        } catch (IOException e) {
            System.err.println("加載調休工作日數據失敗: " + e.getMessage());
        }
    }
    
    /**
     * 判斷日期是否為工作日
     */
    public boolean isWeekday(LocalDate date) {
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY;
    }
    
    /**
     * 判斷日期是否為法定節假日
     */
    public boolean isHoliday(LocalDate date) {
        return holidays.contains(date);
    }
    
    /**
     * 判斷日期是否為調休工作日
     */
    public boolean isAdjustedWorkday(LocalDate date) {
        return adjustedWorkdays.contains(date);
    }
    
    /**
     * 判斷日期是否為需要上班的日子(工作日或調休工作日)
     */
    public boolean isWorkingDay(LocalDate date) {
        // 如果是法定節假日,不是工作日
        if (isHoliday(date)) {
            returnfalse;
        }
        
        // 如果是調休工作日,是工作日
        if (isAdjustedWorkday(date)) {
            returntrue;
        }
        
        // 否則根據周幾判斷
        return isWeekday(date);
    }
    
    public static void main(String[] args) {
        HolidayUtil util = new HolidayUtil();
        LocalDate date = LocalDate.now();
        System.out.println(date + " 是否為工作日: " + util.isWorkingDay(date));
    }
}

使用第三方 API 的方案

/**
 * 基于timor.tech節假日API的工作日判斷工具
 */
public class TimorHolidayApiClient {
    
    private static final String API_BASE_URL = "https://timor.tech/api/holiday/year/";
    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter MONTH_DAY_FORMAT = DateTimeFormatter.ofPattern("MM-dd");
    
    private final HttpClient httpClient = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_2)
            .followRedirects(HttpClient.Redirect.NORMAL)
            .build();
    
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    // 緩存每年的節假日數據,避免頻繁調用API
    private final Map<Integer, HolidayResponse> holidayCache = new ConcurrentHashMap<>();
    
    // 緩存日期到是否為工作日的映射,提升重復查詢性能
    private final Map<LocalDate, Boolean> workdayCache = new ConcurrentHashMap<>();
    
    /**
     * 判斷指定日期是否為工作日
     * @param date 要判斷的日期
     * @returntrue表示工作日,false表示非工作日
     */
    public boolean isWorkingDay(LocalDate date) {
        // 先檢查緩存
        if (workdayCache.containsKey(date)) {
            return workdayCache.get(date);
        }
        
        try {
            // 獲取該年份的節假日數據
            HolidayResponse response = getHolidayData(date.getYear());
            if (response == null || response.getHoliday().isEmpty()) {
                // 沒有節假日數據時,按常規周末判斷
                return isRegularWeekday(date);
            }
            
            // 格式化日期為"MM-dd"格式,用于API結果匹配
            String monthDay = date.format(MONTH_DAY_FORMAT);
            HolidayInfo holidayInfo = response.getHoliday().get(monthDay);
            
            // 處理節假日情況
            if (holidayInfo != null) {
                // 如果是節假日,不是工作日
                if (holidayInfo.isHoliday()) {
                    workdayCache.put(date, false);
                    returnfalse;
                } 
                // 如果是補班日,是工作日
                else {
                    workdayCache.put(date, true);
                    returntrue;
                }
            } 
            // 非節假日也非補班日,按常規周末判斷
            else {
                boolean isWeekday = isRegularWeekday(date);
                workdayCache.put(date, isWeekday);
                return isWeekday;
            }
            
        } catch (Exception e) {
            System.err.println("判斷工作日失敗,日期: " + date + ", 錯誤: " + e.getMessage());
            // 出錯時按常規工作日處理
            boolean isWeekday = isRegularWeekday(date);
            workdayCache.put(date, isWeekday);
            return isWeekday;
        }
    }
    
    /**
     * 獲取指定年份的節假日數據,帶有緩存機制
     */
    private HolidayResponse getHolidayData(int year) throws IOException, InterruptedException {
        if (holidayCache.containsKey(year)) {
            return holidayCache.get(year);
        }
        
        String url = API_BASE_URL + year;
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Accept", "application/json")
                .timeout(java.time.Duration.ofSeconds(10))
                .build();
        
        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
        
        if (response.statusCode() == 200) {
            HolidayResponse holidayResponse = objectMapper.readValue(response.body(), HolidayResponse.class);
            if (holidayResponse.getCode() == 0) { // API返回成功
                holidayCache.put(year, holidayResponse);
                return holidayResponse;
            }
        }
        
        System.err.println("獲取節假日數據失敗,年份: " + year + ", 狀態碼: " + response.statusCode());
        return new HolidayResponse(); // 返回空數據
    }
    
    /**
     * 常規周末判斷(不考慮節假日和補班)
     */
    private boolean isRegularWeekday(LocalDate date) {
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY;
    }
    
    /**
     * 獲取日期對應的節假日信息
     */
    public HolidayInfo getHolidayInfo(LocalDate date) {
        try {
            HolidayResponse response = getHolidayData(date.getYear());
            if (response == null || response.getHoliday().isEmpty()) {
                return null;
            }
            
            String monthDay = date.format(MONTH_DAY_FORMAT);
            return response.getHoliday().get(monthDay);
        } catch (Exception e) {
            System.err.println("獲取節假日信息失敗,日期: " + date + ", 錯誤: " + e.getMessage());
            return null;
        }
    }
    
    /**
     * 清除緩存,適用于需要更新數據的場景
     */
    public void clearCache() {
        holidayCache.clear();
        workdayCache.clear();
    }
    
    /**
     * 示例用法
     */
    public static void main(String[] args) {
        TimorHolidayApiClient client = new TimorHolidayApiClient();
        
        // 測試2025年部分日期
        LocalDate[] dates = {
            LocalDate.of(2025, 1, 1),   // 元旦
            LocalDate.of(2025, 1, 26),  // 春節前補班
            LocalDate.of(2025, 1, 28),  // 除夕
            LocalDate.of(2025, 2, 8),   // 春節后補班
            LocalDate.of(2025, 5, 1),   // 勞動節
            LocalDate.of(2025, 10, 1),  // 國慶節
            LocalDate.of(2025, 10, 11)  // 國慶節后補班
        };
        
        for (LocalDate date : dates) {
            boolean isWorkday = client.isWorkingDay(date);
            HolidayInfo info = client.getHolidayInfo(date);
            
            String status = isWorkday ? "工作日" : "非工作日";
            String name = info != null ? info.getName() : "普通日";
            
            System.out.printf("%s %s - %s%n", 
                    date, 
                    status, 
                    name);
        }
    }
}
責任編輯:龐桂玉 來源: 一安未來
相關推薦

2025-08-07 02:11:00

2014-09-26 10:32:35

2022-04-30 07:53:54

Python腳本語言

2010-04-13 16:28:58

2022-03-27 21:52:52

數據分析運營市場

2021-03-17 08:11:21

SQL工作日數據

2014-09-25 17:30:13

網購網購安全

2011-12-16 13:51:08

2010-08-23 10:55:25

SAPCRM

2013-04-15 09:52:13

程序員

2013-02-17 17:12:44

手機安全

2014-10-27 15:30:35

招聘

2012-12-26 10:03:51

大數據分析大數據存儲

2014-11-05 12:20:28

Radware應用交付

2015-12-04 09:38:03

2012-09-10 10:26:22

工作工作習慣調整心態

2014-07-09 13:24:52

點贊
收藏

51CTO技術棧公眾號

亚洲free性xxxx护士hd| 一区二区中文字幕在线| jizz亚洲| 成人亚洲欧美一区二区三区| 午夜电影久久久| 精品一区在线| 在线观看黄色片| 91亚洲精品一区二区| 婷婷久久综合九色国产成人| 国语产色综合| bdsm精品捆绑chinese女| 国产欧美日韩精品在线观看| 欧美日韩精品在线| 黑丝一区二区三区| 99在线播放| 一本一本a久久| 亚洲欧美国产日韩天堂区| 国产999精品久久久久久绿帽| 中文字幕系列一区| 国产视频一区二区视频| 青青青国产精品一区二区| 婷婷成人综合网| 99热在线精品观看| 波多野结衣乳巨码无在线观看| 麻豆视频传媒入口| 久久精品人人做人人爽| 国产精品美日韩| 成人在线国产| 蜜桃视频网站在线观看| 青春草在线视频免费观看| 中文字幕精品一区久久久久| 国产精品国产精品国产专区不片| 欧美gvvideo网站| 超碰免费在线播放| 激情深爱综合网| 国产国语videosex另类| 5月丁香婷婷综合| 成人性生交大片| 精品产国自在拍| 黄色一级大片在线免费看产| 久久国产精品网| 国产精品永久免费视频| 精品视频999| www.欧美.com| 91综合网人人| 中文字幕在线中文字幕在线中三区| 亚洲福利精品视频| 国产嫩草一区二区三区在线观看 | 欧美成人午夜影院| 色视频成人在线观看免| 国产福利不卡视频| 国产综合免费视频| 自由色视频.| 黄色国产网站在线观看| 97在线观看| 久久精品国产99国产精品| 亚洲青青一区| 秋霞av在线| 992tv快乐视频| 日本a级片电影一区二区| 欧美精品在线一区二区| av爱爱亚洲一区| 国产二区精品| 天天综合网站| 在线观看视频污| 久久综合亚洲精品| 国产一区二中文字幕在线看| 亚洲欧美日韩第一区| 亚洲一区二区三区四区在线免费观看| 日韩国产高清影视| 精品一区av| 成人教育av| 在线播放av网站| 麻豆传媒网站在线观看| 国产精品色婷婷视频| 日韩国产高清视频在线| 亚洲黄色av一区| 麻豆视频一区二区| 久久精品高清| 国产亚洲欧美日韩精品一区二区三区| 你懂的视频在线播放| 黄色一级一级片| 日韩福利在线| 国产欧美在线视频| 欧美成人免费视频| 精品国产一区二区三区忘忧草| 亚洲成年人网站在线观看| 国产精品18久久久久久久网站| 欧美精品播放| 偷拍亚洲精品| 日韩av懂色| 成人在线高清免费| 濑亚美莉一二区在线视频| 国产精品12345| 欧美一级爱爱| 国产日本欧美一区二区三区| 超碰97人人做人人爱少妇| 精品少妇一区二区三区在线视频 | 尤物免费看在线视频| 搞av.com| 亚洲高清123| 亚洲直播在线一区| 欧美在线精品免播放器视频| 最新的欧美黄色| 精品久久一区二区| 色视频成人在线观看免| 一区二区三区在线看| 久久综合色婷婷| 久久99国产精品免费网站| 亚洲视频福利| 波多野结衣在线观看一区二区| 精品一区视频| 成人黄色免费短视频| 污污在线观看| av在线播放网| 欧美黄色小说| 在线免费福利| 国产一级电影网| www.超碰com| 国产裸体舞一区二区三区| 免费网站永久免费观看| 色一情一乱一伦一区二区三区丨| 高清国产在线一区| 亚洲qvod图片区电影| 国产精品久久久久久久久久免费 | 日本免费久久| 丰满诱人av在线播放| 欧美成人xxx| 69久久夜色| 国产一级免费在线观看| 中文在线三区| 污香蕉视频在线观看| 有色激情视频免费在线| 黄页大全在线免费观看| 免费观看v片在线观看| 免费在线观看麻豆视频| 美女黄视频在线播放| 在线看视频你懂的| 亚洲成人观看| 欧美日韩国产综合视频| 欧美18xxxxx| 1024国产在线| 精品视频在线一区二区| 国产激情在线观看| 免费在线播放电影| 高清视频在线观看三级| 中文字幕在线直播| 麻豆蜜桃在线观看| 欧美男体视频| 欧美成人a交片免费看| 成人短视频app| 777午夜精品电影免费看| 国产亚av手机在线观看| 91超碰在线| 成人激情综合| 日韩欧美中文字幕在线视频| 成人性生交大片免费看96| 免费精品国产| 无码一区二区三区视频| 怡红院精品视频在线观看极品| 首页亚洲欧美制服丝腿| 国产精品123| 久久久不卡网国产精品二区| 国产欧美日韩不卡| 亚洲综合自拍偷拍| 色8久久人人97超碰香蕉987| 日韩午夜精品电影| 中文字幕亚洲无线码在线一区| 久久欧美在线电影| 国产成人综合av| 精品日本一区二区三区在线观看| 新呦u视频一区二区| 欧美寡妇偷汉性猛交| 国产成一区二区| 国产欧美日韩综合一区在线观看 | 婷婷开心激情综合| 日韩欧中文字幕| 日韩精品一区二区三区四区视频| 国产婷婷成人久久av免费高清 | 欧美特黄一级大片| 亚洲午夜精品久久久久久app| 视频一区二区三区在线| 成人午夜精品一区二区三区| 最近日韩中文字幕| 欧美日韩在线一区二区| 亚洲天堂网站在线观看视频| 91精品国产91久久久久久吃药| 99影视tv| 欧美一级欧美一级| 中文天堂av| 国产丝袜视频在线播放| 中文字幕亚洲在线观看| 欧美96在线丨欧| 狠狠v欧美v日韩v亚洲ⅴ| 91老司机福利 在线| 精品国产91久久久| 亚洲精品国产品国语在线| 97国产精品视频| 欧美福利精品| www.四虎成人|