{"apis":["useDateRange","useTimezone"],"bug_class":"api_contract","fault_shape":"api_contract","fidelity_tier":"A","id":"card-dt-1.tz-arg-umami-4112","mechanism":"RevenuePage called useDateRange() without a timezone argument, so parseDateRange() fell back to the browser's local time when computing the date range boundaries, causing the chart to display timestamps based on local PC time while header stats used the configured 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":[]},"runtime_dependence":{"levers_absent":["path_ambiguity","ordering_or_concurrency"],"levers_apply":["hidden_runtime_state"],"levers_unverified":["distance_between_symptom_and_cause","plausible_wrong_static_fix","magnitude_visible_only_at_runtime","external_side_effect_semantics"],"reason":"The bug is a timezone-propagation mismatch. The seven levers (hidden_runtime_state, distance_between_symptom_and_cause, plausible_wrong_static_fix, path_ambiguity, ordering_or_concurrency, magnitude_visible_only_at_runtime, external_side_effect_semantics) are assessed based on the input, which only shows a direct code change and not runtime logs or additional context. Runtime state such as the user's configured timezone is present during execution, so hidden_runtime_state applies. The symptom appears in the UI display after the function returns, so distance_between_symptom_and_cause is unverified on the provided text. Plausible wrong static fix cannot be determined from the diff alone. Path ambiguity is absent because only one useDateRange call exists in the file. Ordering or concurrency is absent as the bug is not timing-dependent. Magnitude visible only at runtime is unverified because the input does not describe how wrong the result is. External side-effect semantics is unverified because the input does not describe how an outside system behaves when called. Therefore: hidden_runtime_state=apply, distance_between_symptom_and_cause=unverified, plausible_wrong_static_fix=unverified, path_ambiguity=absent, ordering_or_concurrency=absent, magnitude_visible_only_at_runtime=unverified, external_side_effect_semantics=unverified","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 based on local PC time while header stats used the settings timezone","trigger":"missing timezone argument in useDateRange"}