Ось набір принципів, які в мене сформувалися на практиці роботи з таймзонами:
1. Timezone, як і locale, — це частина UX, тому її обробка має виконуватися на client-side, а не на server-side.
2. Комунікація client ↔ server здійснюється виключно в UTC.
Формат серіалізації — передавати значення як string чи як timestamp — визначає команда FE, але timestamp зазвичай має менший розмір і економніший у передачі.
3. Server-time завжди в UTC. Це гарантується на рівні коду ось так:
process.env.TZ = 'UTC'
4. Дані в базі зберігаються як timestamp without time zone.
5. Якщо бізнес-логіка цього потребує, server зберігає user-timezone у DB та використовує його для розрахунків. Наприклад, користувач запитує: “Покажи мої події за вчора”.
6. Усі обчислення, що залежать від timezone, виконуються на рівні запитів до бази даних. Для цього використовуємо SQL-запити з AT TIME ZONE