在 Pentaho Data Integration (Kettle) 中,常需處理複雜的日期邏輯。本文介紹如何在 Kettle 的 JavaScript 步驟中呼叫自訂 Java 類別,實現高效的日期範圍遍歷與格式化功能。
這個工具類提供日期解析、閏年判斷、日期加減運算、範圍遍歷等完整功能:
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);
}
}
lib 目錄var AccountDate = Java.type("AccountDate");
var dateList = AccountDate.getEveryday("2024-01-01", "2024-01-31");
for (var i = 0; i < dateList.size(); i++) {
// 處理每個日期...
}TimeZonetry-catch 捕捉 Java 拋出的異常透過 Java 與 JavaScript 的協作,可在 Kettle 中靈活處理複雜日期邏輯,兼顧開發效率與執行效能。