首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Kettle 中使用 JavaScript 呼叫 Java 日期工具類實戰

     編輯:Java 相關知識

前言

在 Pentaho Data Integration (Kettle) 中,常需處理複雜的日期邏輯。本文介紹如何在 Kettle 的 JavaScript 步驟中呼叫自訂 Java 類別,實現高效的日期範圍遍歷與格式化功能。

核心 Java 工具類:AccountDate

這個工具類提供日期解析、閏年判斷、日期加減運算、範圍遍歷等完整功能:

public class AccountDate {
    private static final int[] DAYS_P_MONTH_LY = {31,29,31,30,31,30,31,31,30,31,30,31};
    private static final int[] DAYS_P_MONTH_CY = {31,28,31,30,31,30,31,31,30,31,30,31};
    private static final int Y=0, M=1, D=2;
    private static transient int gregorianCutoverYear = 1582;

    // 解析 "yyyyMMdd" 字串為 int[] {year, month, day}
    public static int[] splitYMD(String date) { ... }

    // 判斷閏年
    public static boolean isLeapYear(int year) { ... }

    // 日期加一天
    private static int[] addOneDay(int year, int month, int day) { ... }

    // 格式化月/日為兩位數
    public static String formatMonthDay(int decimal) { ... }

    // 格式化年份為四位數
    public static String formatYear(int decimal) { ... }

    // 計算兩日期間天數差
    public static long countDay(String begin, String end) { ... }

    // 核心功能:取得日期範圍內每一天
    public static List<String> getEveryday(String beginDate, String endDate) {
        long days = countDay(beginDate, endDate);
        int[] ymd = splitYMD(beginDate);
        List<String> everyDays = new ArrayList<>();
        everyDays.add(beginDate);
        for (int i = 0; i < days; i++) {
            ymd = addOneDay(ymd[Y], ymd[M], ymd[D]);
            everyDays.add(formatYear(ymd[Y]) + "-" + 
                         formatMonthDay(ymd[M]) + "-" + 
                         formatMonthDay(ymd[D]));
        }
        return everyDays;
    }

    public static void main(String[] args) {
        List<String> list = AccountDate.getEveryday("2008-08-29", "2008-09-02");
        list.forEach(System.out::println);
    }
}

Kettle 整合步驟

  1. 將編譯後的 JAR 包放入 Kettle 的 lib 目錄
  2. 重啟 Spoon 設計工具
  3. 在轉換中添加「Modified Java Script Value」步驟
  4. 腳本中呼叫:
    var AccountDate = Java.type("AccountDate");
    var dateList = AccountDate.getEveryday("2024-01-01", "2024-01-31");
    for (var i = 0; i < dateList.size(); i++) {
        // 處理每個日期...
    }

進階應用建議

  • 效能優化:大量日期運算時,建議在 Java 端完成迴圈,僅傳回最終 List 給 JS
  • 時區處理:跨時區專案請在 Java 端明確指定 TimeZone
  • 錯誤處理:JS 中包裝 try-catch 捕捉 Java 拋出的異常

透過 Java 與 JavaScript 的協作,可在 Kettle 中靈活處理複雜日期邏輯,兼顧開發效率與執行效能。

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