This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 705107621ca fix(ui): use ISO dates in Gantt chart for cross-browser 
consistency (#61250)
705107621ca is described below

commit 705107621ca10fed635b0374ab1b9ca46b11766f
Author: yuseok89 <[email protected]>
AuthorDate: Sat Jan 31 01:25:21 2026 +0900

    fix(ui): use ISO dates in Gantt chart for cross-browser consistency (#61250)
---
 .../src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx   | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx 
b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx
index 1c49d76ebba..582353c12e1 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/Gantt.tsx
@@ -52,7 +52,6 @@ import { useGridStructure } from 
"src/queries/useGridStructure";
 import { useGridTiSummaries } from "src/queries/useGridTISummaries";
 import { getComputedCSSVariableValue } from "src/theme";
 import { isStatePending, useAutoRefresh } from "src/utils";
-import { DEFAULT_DATETIME_FORMAT_WITH_TZ, formatDate } from 
"src/utils/datetimeUtils";
 
 import { createHandleBarClick, createHandleBarHover, createChartOptions } from 
"./utils";
 
@@ -159,8 +158,6 @@ export const Gantt = ({ dagRunState, limit, runType, 
triggeringUser }: Props) =>
 
   const isLoading = runsLoading || structureLoading || summariesLoading || 
tiLoading;
 
-  const currentTime = 
dayjs().tz(selectedTimezone).format(DEFAULT_DATETIME_FORMAT_WITH_TZ);
-
   const gridSummaries = gridTiSummaries?.task_instances ?? [];
   const taskInstances = taskInstancesData?.task_instances ?? [];
 
@@ -172,15 +169,15 @@ export const Gantt = ({ dagRunState, limit, runType, 
triggeringUser }: Props) =>
             const gridSummary = gridSummaries.find((ti) => ti.task_id === 
node.id);
 
             if ((node.isGroup ?? node.is_mapped) && gridSummary) {
-              // Use min/max times from grid summary
+              // Use min/max times from grid summary; ISO so time scale and 
bar positions render consistently across browsers
               return {
                 isGroup: node.isGroup,
                 isMapped: node.is_mapped,
                 state: gridSummary.state,
                 taskId: gridSummary.task_id,
                 x: [
-                  formatDate(gridSummary.min_start_date, selectedTimezone, 
DEFAULT_DATETIME_FORMAT_WITH_TZ),
-                  formatDate(gridSummary.max_end_date, selectedTimezone, 
DEFAULT_DATETIME_FORMAT_WITH_TZ),
+                  dayjs(gridSummary.min_start_date).toISOString(),
+                  dayjs(gridSummary.max_end_date).toISOString(),
                 ],
                 y: gridSummary.task_id,
               };
@@ -190,17 +187,14 @@ export const Gantt = ({ dagRunState, limit, runType, 
triggeringUser }: Props) =>
 
               if (taskInstance) {
                 const hasTaskRunning = isStatePending(taskInstance.state);
-                const endTime = hasTaskRunning ? currentTime : 
taskInstance.end_date;
+                const endTime = hasTaskRunning ? dayjs().toISOString() : 
taskInstance.end_date;
 
                 return {
                   isGroup: node.isGroup,
                   isMapped: node.is_mapped,
                   state: taskInstance.state,
                   taskId: taskInstance.task_id,
-                  x: [
-                    formatDate(taskInstance.start_date, selectedTimezone, 
DEFAULT_DATETIME_FORMAT_WITH_TZ),
-                    formatDate(endTime, selectedTimezone, 
DEFAULT_DATETIME_FORMAT_WITH_TZ),
-                  ],
+                  x: [dayjs(taskInstance.start_date).toISOString(), 
dayjs(endTime).toISOString()],
                   y: taskInstance.task_id,
                 };
               }

Reply via email to