首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 計算工作時間:排除周末與法定節假日的完整實現思路

     編輯:程式設計綜合問答

核心難點

原代碼已實現「排除周末、按上下班時間計算工時」,缺少「動態排除法定節假日及調休上班日」邏輯。

解決方案架構

  1. 節假日數據源:維護一張表(資料庫/JSON/屬性文件),記錄每年法定節假日日期範圍及調休上班日期。
    示例結構:
    {
      "2024": {
        "holidays": ["01-01","02-10","02-11",...],
        "workdays": ["02-04","02-18",...]  // 調休上班日
      }
    }
    
  2. 判斷邏輯封裝:
    boolean isHoliday(LocalDate date) {
        String key = date.format(DateTimeFormatter.ofPattern("MM-dd"));
        YearConfig cfg = configMap.get(date.getYear());
        return cfg.holidays.contains(key) && !cfg.workdays.contains(key);
    }
    boolean isWeekend(LocalDate date) {
        DayOfWeek dow = date.getDayOfWeek();
        return dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY;
    }
    boolean isWorkingDay(LocalDate date) {
        return !isWeekend(date) && !isHoliday(date);
    }
    
  3. 工時計算整合:在原有逐日/逐小時累加邏輯中,跳過非工作日:
    while (current.isBefore(end) || current.isEqual(end)) {
        if (isWorkingDay(current)) {
            // 累加當日工時
        }
        current = current.plusDays(1);
    }
    
  4. 數據更新機制:每年節假日安排發布後(通常 12 月),及時更新配置,建議從國務院辦公廳官網或權威日曆 API 獲取。

關鍵提示

  • 使用 Java 8+ java.time 包(LocalDate、LocalTime、Duration)替代老舊 Date/Calendar,代碼更清晰、線程安全。
  • 節假日配置外部化,避免硬編碼導致每年改代碼。
  • 考慮跨年、跨月、橫跨午休時間等邊界情況,單元測試覆蓋關鍵場景。

參考實現

回答中提供的 isOverDay/isHodliDays 方法展示了基於字符串匹配的簡易判斷邏輯,可作為起點擴展為完整配置驅動方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved