Вопрос проверяет понимание подходов к обработке временных зон пользователя при серверном рендеринге (SSR), что критично для корректного отображения дат и времени в интернациональных приложениях.
При серверном рендеринге (SSR) даты генерируются на сервере, но должны отображаться в соответствии с часовым поясом пользователя. Если этого не сделать, пользователи в разных регионах увидят некорректное время, что ухудшит пользовательский опыт, особенно в календарях, системах бронирования или лентах событий.
X-User-Timezone: America/New_York). Браузеры также передают локаль в Accept-Language, но она не всегда точно отражает часовой пояс.Все даты в базе данных и внутренней логике должны храниться в UTC. При SSR сервер получает информацию о временной зоне пользователя, конвертирует UTC-даты в эту зону и вставляет отформатированные строки в HTML. На клиенте JavaScript может перепроверять и корректировать отображение, если нужно.
// Серверная часть (Express + date-fns-tz)
const express = require('express');
const { format, utcToZonedTime } = require('date-fns-tz');
const app = express();
app.get('/api/events', (req, res) => {
// 1. Получаем временную зону из заголовка, cookie или БД
const userTimeZone = req.headers['x-user-timezone'] || 'UTC';
// 2. Дата из БД в UTC
const eventDateUtc = new Date('2023-12-25T10:00:00Z');
// 3. Конвертируем в зону пользователя
const userDate = utcToZonedTime(eventDateUtc, userTimeZone);
// 4. Форматируем для отображения
const formattedDate = format(userDate, 'yyyy-MM-dd HH:mm', { timeZone: userTimeZone });
// 5. Передаём в шаблон (например, для SSR)
res.render('event', { date: formattedDate, timeZone: userTimeZone });
});На клиенте можно использовать Intl API для проверки или повторного форматирования, если зона изменилась.
Используйте комбинированный подход: определите зону через заголовки или IP при первом визите, предложите пользователю подтвердить её в настройках и храните в базе. Всегда работайте с датами в UTC на сервере, конвертируя только на этапе рендеринга. Это обеспечит консистентность данных и корректное отображение для пользователей по всему миру.