# Task: Global Date & Time Formatting Standard (Hydration-safe) ## Objective Eliminate all React hydration mismatch issues caused by inconsistent date formatting between Server Components and Client Components. Establish a single global date formatting standard across the entire application. --- ## Problem Current implementation uses: * Date.toLocaleString() * Date.toLocaleDateString() * Date.toLocaleTimeString() These APIs depend on: * Browser Locale * Operating System Locale * Server Locale * Server Timezone * Browser Timezone This causes inconsistent rendering between SSR and Client Hydration. Example Server 16/6/2569 17:00:00 Client 6/16/2026, 5:00:00 PM Result React Hydration Error --- ## Requirements ### 1. Create Global Date Utility Create ``` src/lib/date-format.ts ``` All UI must use this utility. --- ### 2. Never use Forbidden ``` toLocaleString() toLocaleDateString() toLocaleTimeString() Intl.DateTimeFormat() new Date().toString() ``` directly inside React components. --- ### 3. Standard Display Format Date only ``` YYYY-MM-DD Example 2026-06-25 ``` Date Time ``` YYYY-MM-DD HH:mm:ss Example 2026-06-25 14:35:20 ``` Time ``` HH:mm:ss ``` Month ``` YYYY-MM ``` Year ``` YYYY ``` --- ### 4. Timezone Always ``` Asia/Bangkok ``` Never depend on browser timezone. --- ### 5. Calendar Always use Gregorian Calendar Never Buddhist Calendar. Display 2026 Never 2569 --- ### 6. SSR Safe Formatting must produce identical output on * Server * Client * Static Render * Hydration No locale-dependent output. --- ### 7. Usage Replace every occurrence of ``` toLocaleString() toLocaleDateString() toLocaleTimeString() Intl.DateTimeFormat() ``` with ``` formatDate() formatDateTime() formatTime() formatMonth() formatYear() ``` --- ### 8. Dashboard Update all CRM Dashboard components. Especially * Approval Metrics * Lead Tables * Opportunity Tables * Quotation Tables * Activity Timeline * Follow-up * Reports --- ### 9. Tables Default date column ``` YYYY-MM-DD ``` Only show time when business requires it. --- ### 10. Forms Date Picker Store ISO8601 UTC Display YYYY-MM-DD --- ### 11. API API returns ISO8601 Example ``` 2026-06-25T10:35:20.000Z ``` UI handles formatting. --- ## Acceptance Criteria * No Hydration mismatch. * No locale-dependent rendering. * Same output in Server and Client. * All dashboard pages use global formatter. * All table date columns display YYYY-MM-DD. * No usage of toLocaleString(), toLocaleDateString(), toLocaleTimeString() inside UI components.