From c48639369b02e9ec1d927a68c0548fc67494177d Mon Sep 17 00:00:00 2001 From: viettranx Date: Thu, 2 Apr 2026 08:23:05 +0700 Subject: [PATCH] fix(cron): apply timezone to all schedule kinds, not just cron Move TZ application before schedule kind switch in MergeCronSchedule. Ensure timezone applies consistently to cron, every, and at expressions. --- internal/store/cron_store.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/internal/store/cron_store.go b/internal/store/cron_store.go index ad5f1af9..6f658331 100644 --- a/internal/store/cron_store.go +++ b/internal/store/cron_store.go @@ -237,6 +237,8 @@ func MergeCronSchedule(current CronSchedule, patch *CronSchedule) CronSchedule { } merged := CronSchedule{Kind: newKind} + // TZ: always use patch value for all schedule kinds. Empty = UTC (default). + merged.TZ = patch.TZ switch newKind { case "cron": if patch.Expr != "" { @@ -244,9 +246,6 @@ func MergeCronSchedule(current CronSchedule, patch *CronSchedule) CronSchedule { } else if current.Kind == newKind { merged.Expr = current.Expr } - // TZ: always use patch value. Empty = UTC (default). - // Callers (UI, agent tool) send full schedule via spread, so empty is explicit. - merged.TZ = patch.TZ case "every": if patch.EveryMS != nil { merged.EveryMS = patch.EveryMS @@ -298,25 +297,25 @@ func ValidateCronSchedule(schedule *CronSchedule) error { func ApplyCronScheduleUpdates(updates map[string]any, schedule CronSchedule) { updates["schedule_kind"] = schedule.Kind + // TZ applies to all schedule kinds (used for display and cron evaluation). + if schedule.TZ != "" { + updates["timezone"] = schedule.TZ + } else { + updates["timezone"] = nil + } + switch schedule.Kind { case "cron": updates["cron_expression"] = schedule.Expr - if schedule.TZ != "" { - updates["timezone"] = schedule.TZ - } else { - updates["timezone"] = nil - } updates["interval_ms"] = nil updates["run_at"] = nil case "every": updates["cron_expression"] = nil - updates["timezone"] = nil updates["interval_ms"] = *schedule.EveryMS updates["run_at"] = nil case "at": runAt := time.UnixMilli(*schedule.AtMS) updates["cron_expression"] = nil - updates["timezone"] = nil updates["interval_ms"] = nil updates["run_at"] = runAt }