diff --git a/packages/vtable-gantt/src/tools/util.ts b/packages/vtable-gantt/src/tools/util.ts index 21716b6a12..8f49e753b7 100644 --- a/packages/vtable-gantt/src/tools/util.ts +++ b/packages/vtable-gantt/src/tools/util.ts @@ -677,6 +677,10 @@ export function computeCountToTimeScale( let difference: number; const adjusted_date = new Date(date.getTime() + diffMS); + + const startDaysInMonth = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0).getDate(); + const adjustedDaysInMonth = new Date(adjusted_date.getFullYear(), adjusted_date.getMonth() + 1, 0).getDate(); + switch (timeScale) { case 'second': difference = (adjusted_date.getTime() - startDate.getTime()) / msInSecond; @@ -697,9 +701,10 @@ export function computeCountToTimeScale( difference = (adjusted_date.getFullYear() - startDate.getFullYear()) * 12 + (adjusted_date.getMonth() - startDate.getMonth()); - difference += - (adjusted_date.getDate() - startDate.getDate()) / - new Date(adjusted_date.getFullYear(), adjusted_date.getMonth() + 1, 0).getDate(); + + // Calculate fractional difference by normalizing day progress within each specific month + // This handles variable month lengths (28/29/30/31 days) correctly + difference += adjusted_date.getDate() / adjustedDaysInMonth - startDate.getDate() / startDaysInMonth; break; case 'quarter': difference =