From 99fc79a9450f165c788f3021d45eb7709305b40d Mon Sep 17 00:00:00 2001 From: Divyansh Date: Fri, 6 Mar 2026 10:43:55 +0530 Subject: [PATCH 1/4] =?UTF-8?q?Fix=20DST=20issue=20when=20calculating=20yy?= =?UTF-8?q?yyMMdd=C2=B1N=20time=20placeholders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/api/parser/TimePlaceholderUtils.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java index 24bb79187073..2268e61dd7f1 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java @@ -19,7 +19,6 @@ import static org.apache.commons.lang3.time.DateUtils.addWeeks; import static org.apache.dolphinscheduler.common.utils.DateUtils.addDays; -import static org.apache.dolphinscheduler.common.utils.DateUtils.addMinutes; import static org.apache.dolphinscheduler.common.utils.DateUtils.addMonths; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.ADD_CHAR; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.ADD_MONTHS; @@ -528,7 +527,7 @@ public static Map.Entry calcCustomDay(String expression, String ke break; case THIS_DAY: dataFormat = expression.substring(THIS_DAY.length() + 1, expression.length() - 1); - targetDate = addDays(date, 0); + targetDate = date; break; case LAST_DAY: dataFormat = expression.substring(LAST_DAY.length() + 1, expression.length() - 1); @@ -649,9 +648,10 @@ public static Map.Entry calcMinutes(String expression, Date date) if (expression.contains("+")) { int index = expression.lastIndexOf('+'); - if (Character.isDigit(expression.charAt(index + 1))) { - String addMinuteExpr = expression.substring(index + 1); - Date targetDate = addMinutes(date, calcMinutes(addMinuteExpr)); + if (index + 1 < expression.length() && Character.isDigit(expression.charAt(index + 1))) { + String addDayExpr = expression.substring(index + 1); + int days = Integer.parseInt(addDayExpr); + Date targetDate = addDays(date, days); String dateFormat = expression.substring(0, index); return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat); @@ -659,9 +659,10 @@ public static Map.Entry calcMinutes(String expression, Date date) } else if (expression.contains("-")) { int index = expression.lastIndexOf('-'); - if (Character.isDigit(expression.charAt(index + 1))) { - String addMinuteExpr = expression.substring(index + 1); - Date targetDate = addMinutes(date, 0 - calcMinutes(addMinuteExpr)); + if (index + 1 < expression.length() && Character.isDigit(expression.charAt(index + 1))) { + String addDayExpr = expression.substring(index + 1); + int days = Integer.parseInt(addDayExpr); + Date targetDate = addDays(date, -days); String dateFormat = expression.substring(0, index); return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat); From 85c77362df4394e8299d47e95dd6ddbf13641886 Mon Sep 17 00:00:00 2001 From: Divyansh Date: Mon, 9 Mar 2026 22:08:40 +0530 Subject: [PATCH 2/4] =?UTF-8?q?Improve=20DST=20handling=20using=20LocalDat?= =?UTF-8?q?e=20and=20handle=20NumberFormatException=20for=20yyyyMMdd=C2=B1?= =?UTF-8?q?N?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/api/parser/TimePlaceholderUtils.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java index 2268e61dd7f1..c894339790f2 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java @@ -18,7 +18,6 @@ package org.apache.dolphinscheduler.plugin.task.api.parser; import static org.apache.commons.lang3.time.DateUtils.addWeeks; -import static org.apache.dolphinscheduler.common.utils.DateUtils.addDays; import static org.apache.dolphinscheduler.common.utils.DateUtils.addMonths; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.ADD_CHAR; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.ADD_MONTHS; @@ -62,6 +61,9 @@ import java.util.Map; import java.util.Stack; +import java.time.LocalDate; +import java.time.ZoneId; + import lombok.extern.slf4j.Slf4j; /** @@ -650,8 +652,20 @@ public static Map.Entry calcMinutes(String expression, Date date) if (index + 1 < expression.length() && Character.isDigit(expression.charAt(index + 1))) { String addDayExpr = expression.substring(index + 1); - int days = Integer.parseInt(addDayExpr); - Date targetDate = addDays(date, days); + int days; + try { + days = Integer.parseInt(addDayExpr); + } catch (NumberFormatException e) { + return null; + } + LocalDate localDate = date.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate() + .plusDays(days); + + Date targetDate = Date.from( + localDate.atStartOfDay(ZoneId.systemDefault()).toInstant() + ); String dateFormat = expression.substring(0, index); return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat); @@ -661,8 +675,20 @@ public static Map.Entry calcMinutes(String expression, Date date) if (index + 1 < expression.length() && Character.isDigit(expression.charAt(index + 1))) { String addDayExpr = expression.substring(index + 1); - int days = Integer.parseInt(addDayExpr); - Date targetDate = addDays(date, -days); + int days; + try { + days = Integer.parseInt(addDayExpr); + } catch (NumberFormatException e) { + return null; + } + LocalDate localDate = date.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate() + .minusDays(days); + + Date targetDate = Date.from( + localDate.atStartOfDay(ZoneId.systemDefault()).toInstant() + ); String dateFormat = expression.substring(0, index); return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat); From 9f5079808a5a20535f843c31e6ac9ce1bcde65ec Mon Sep 17 00:00:00 2001 From: Divyansh Date: Wed, 11 Mar 2026 16:34:54 +0530 Subject: [PATCH 3/4] Apply spotless formatting --- .../task/api/parser/TimePlaceholderUtils.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java index c894339790f2..3bbd7e8f9ba7 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java @@ -53,6 +53,8 @@ import org.apache.commons.lang3.StringUtils; +import java.time.LocalDate; +import java.time.ZoneId; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Calendar; @@ -61,9 +63,6 @@ import java.util.Map; import java.util.Stack; -import java.time.LocalDate; -import java.time.ZoneId; - import lombok.extern.slf4j.Slf4j; /** @@ -653,19 +652,18 @@ public static Map.Entry calcMinutes(String expression, Date date) if (index + 1 < expression.length() && Character.isDigit(expression.charAt(index + 1))) { String addDayExpr = expression.substring(index + 1); int days; - try { - days = Integer.parseInt(addDayExpr); - } catch (NumberFormatException e) { - return null; - } + try { + days = Integer.parseInt(addDayExpr); + } catch (NumberFormatException e) { + return null; + } LocalDate localDate = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate() .plusDays(days); Date targetDate = Date.from( - localDate.atStartOfDay(ZoneId.systemDefault()).toInstant() - ); + localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); String dateFormat = expression.substring(0, index); return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat); @@ -677,7 +675,7 @@ public static Map.Entry calcMinutes(String expression, Date date) String addDayExpr = expression.substring(index + 1); int days; try { - days = Integer.parseInt(addDayExpr); + days = Integer.parseInt(addDayExpr); } catch (NumberFormatException e) { return null; } @@ -687,8 +685,7 @@ public static Map.Entry calcMinutes(String expression, Date date) .minusDays(days); Date targetDate = Date.from( - localDate.atStartOfDay(ZoneId.systemDefault()).toInstant() - ); + localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); String dateFormat = expression.substring(0, index); return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat); From edca8604f8e4b1803c1842b671a32eabac23dde1 Mon Sep 17 00:00:00 2001 From: Divyansh Pratap Singh Date: Mon, 16 Mar 2026 20:06:28 +0530 Subject: [PATCH 4/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../plugin/task/api/parser/TimePlaceholderUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java index 3bbd7e8f9ba7..6c17af83d9b1 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parser/TimePlaceholderUtils.java @@ -655,7 +655,7 @@ public static Map.Entry calcMinutes(String expression, Date date) try { days = Integer.parseInt(addDayExpr); } catch (NumberFormatException e) { - return null; + throw new IllegalArgumentException("Invalid minute expression: " + expression, e); } LocalDate localDate = date.toInstant() .atZone(ZoneId.systemDefault()) @@ -677,7 +677,7 @@ public static Map.Entry calcMinutes(String expression, Date date) try { days = Integer.parseInt(addDayExpr); } catch (NumberFormatException e) { - return null; + throw new IllegalArgumentException("Invalid minute expression: " + expression, e); } LocalDate localDate = date.toInstant() .atZone(ZoneId.systemDefault())