{"apis":[],"bug_class":"time_and_date","fault_shape":"DT-1.tz-arg","fidelity_tier":"A","id":"card-dt-1.tz-arg-umami-4112","mechanism":"RevenuePage called useDateRange without a timezone argument, so parseDateRange used the browser's local timezone instead of the configured settings timezone, causing the chart axis to display timestamps in local time while header stats used the settings timezone.","provenance":{"date":"2026-03-25","license":"MIT","repository":"https://github.com/umami-software/umami","source_links":["https://github.com/umami-software/umami/pull/4112","https://github.com/umami-software/umami/commit/e6f3f3b4b40a490d5cb050471baa0999366dab2a"]},"references":{"diff_excerpt":"diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx\\nindex 3e429c1..4dc19e0 100644\\n--- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx\\n+++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx\\n@@ -1,13 +1,14 @@\\n 'use client';\n import { Column } from '@umami/react-zen';\n import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';\n-import { useDateRange } from '@/components/hooks';\n+import { useDateRange, useTimezone } from '@/components/hooks';\n import { Revenue } from './Revenue';\n\\n export function RevenuePage({ websiteId }: { websiteId: string }) {\\n+  const { timezone } = useTimezone();\\n   const {\\n     dateRange: { startDate, endDate, unit },\\n-  } = useDateRange();\\n+  } = useDateRange({ timezone });\\n \\n   return (\\n     <Column gap>","failing_tests":["not_provided"]},"runtime_dependence":{"levers_absent":["path_ambiguity","ordering_or_concurrency","external_side_effect_semantics"],"levers_apply":["hidden_runtime_state","distance_between_symptom_and_cause","plausible_wrong_static_fix","magnitude_visible_only_at_runtime"],"levers_unverified":[],"reason":"Hidden runtime state (the configured timezone setting) is only available at runtime via useTimezone; distance between symptom and cause is one file apart (header vs chart); plausible wrong static fix (omit timezone argument appears correct but produces mismatch); path ambiguity not present; ordering or concurrency not relevant; magnitude visible only at runtime when chart and header are compared; external side-effect semantics not relevant","value":"unknown"},"shape":{"matched_lines":["-  } = useDateRange();","+  } = useDateRange({ timezone });"],"rules_matched":["dt-1.tz-arg.source"],"shape_id":"DT-1.tz-arg"},"symptom":"Chart X-axis timestamps and header stats use different timezones, causing a mismatch","trigger":"useDateRange() without timezone argument causes parseDateRange to fall back to browser local timezone"}