2.8 KiB
2.8 KiB
Timezone Standard
Purpose
This document defines the single-source timezone standard for IGNY8 and how all future time-related features must use it.
Single Source of Truth
- Account timezone is the canonical timezone for all user-visible times and scheduling UI.
- The value is stored on the Account model as
account_timezone(IANA name, e.g.,America/New_York). - Selection modes:
- Country-derived: timezone is derived from billing country.
- Manual: user picks an IANA timezone that maps to a UTC offset list.
Storage Rules
- Persist timestamps in UTC in the database.
- Never store local times without timezone context.
- Store user selection in
Account.account_timezoneand (when needed)timezone_modeandtimezone_offsetfor UI display.
Display Rules (Frontend)
- All UI formatting must use the account timezone.
- Use shared helpers:
getAccountTimezone()for the active timezone.formatDate(),formatDateTime(),formatRelativeDate()for consistent formatting.
- Do not call
toLocaleDateString()ortoLocaleTimeString()without passing the account timezone.
Scheduling Rules
- All scheduling inputs in UI are account timezone.
- Convert to UTC before sending to the backend.
- All API payloads for scheduling must send ISO-8601 with timezone offset.
- The backend stores scheduled datetimes in UTC.
Backend API Contract
- Endpoints that return timestamps should return UTC ISO strings.
- Endpoints that return “server time” should return account-local time for display, plus the account timezone identifier.
- If the account timezone is invalid or missing, fall back to
UTC.
Country List Source
- Country list must be fetched from
/v1/auth/countries/. - No hardcoded country lists in UI or backend responses.
Implementation Checklist (New Features)
- Input: confirm user inputs are in account timezone.
- Conversion: convert to UTC before persistence or scheduling.
- Storage: store in UTC only.
- Output: format all timestamps with account timezone helpers.
- API: ensure responses include timezone-aware context when needed.
Guardrails
- Never introduce a second timezone source per user/site.
- Do not mix server timezone with account timezone in UI.
- Avoid timezone math in the UI; prefer helpers and backend-provided values when possible.
Examples
- Display date in UI:
- Use
formatDateTime(timestamp)to render in account timezone.
- Use
- Schedule content:
- User selects date/time in account timezone → convert to ISO → send to
/schedule/.
- User selects date/time in account timezone → convert to ISO → send to
Troubleshooting
- If times appear “off”:
- Check account timezone is set.
- Confirm UI uses helpers.
- Confirm backend converts to UTC before save.
Owner: Platform Last updated: 2026-01-19