Отображение локализованной временной метки в часовом поясе пользователя

Для любого приложения, поддерживающего несколько локалей и часовых поясов, часто требуется отображать дату и временную метку, скорректированную с учетом смещения часового пояса пользователя. В этом уроке мы научимся отображать дату и время в часовом поясе пользователя.

1. Обзор

Для отображения локализованных временных меток у нас есть два основных варианта:

  • Измените дату и время на стороне сервера и верните строку для отображения непосредственно на экране клиента.
  • Верните клиенту дату по Гринвичу и позвольте клиенту самостоятельно настроить часовой пояс и отобразить его на экране.

Оба варианта просты в реализации. Единственные различия — это проблемы дизайна и удобства использования, которые различаются от случая к случаю.

2. Настройте часовой пояс на стороне сервера.

Настройка часового пояса на стороне сервера может быть выполнена для приложений, которые обслуживаются глобально для всех пользователей, чтобы отображать вывод сервера таким, какой он есть на экране. В таких случаях клиенты, как правило, не обрабатывают вывод сервера и используются только для отображения информации, отправленной сервером.

Обратите внимание, что объект HttpRequest не поддерживает информацию о часовом поясе напрямую, поэтому многие веб-сайты запрашивают часовой пояс пользователя во время процесса регистрации.

На стороне сервера мы можем использовать класс ZonedDateTime Java для преобразования заданного момента времени в часовой пояс клиента.

//Suppose this is UTC timestamp fetched from databaseZonedDateTime instant = ZonedDateTime.now(ZoneId.of("UTC"));ZonedDateTime instantInUTC =instant.withZoneSameInstant(ZoneId.of("Asia/Kolkata"));DateTimeFormatter formatter= DateTimeFormatter.ofPattern("dd MMM, yyyy 'at' HH:mm a");//Send this to the client for displaying on screenString formattedZdt = instantInUTC.format(formatter);System.out.println(formattedZdt); //21 Feb, 2022 at 22:03 pm

3. Настройте часовой пояс на стороне клиента.

Это рекомендуемый и наиболее используемый подход, поскольку он не требует сниффинга часового пояса пользователя на стороне сервера. Сервер отправляет дату и время UTC всем пользователям по всему миру, а клиентский скрипт изменяет время UTC на локальное время.

Получение часового пояса пользователя на стороне клиента — довольно простой подход, и большинство браузеров поддерживают запрос информации о часовом поясе, включая собственный JavaScript.

3.1. Date.getTimezoneOffset()

Функция getTimezoneOffset() возвращает разницу во времени в минутах между временем UTC и местным временем. Возвращаемое значение положительно, если местный часовой пояс отстает от UTC, и отрицательно, если местный часовой пояс опережает UTC.

Например, если ваш часовой пояс UTC+5, метод getTimezoneOffset() вернет -300 минут:

var date = new Date();var offset = date.getTimezoneOffset(); // -300

Помните, что метод getTimezoneOffset() возвращает только смещение местного часового пояса относительно времени UTC, а не фактический часовой пояс.

Значение возвращаемого смещения меняется в зависимости от правил перехода на летнее время(DST). Не следует пытаться найти часовой пояс с использованием смещения, поскольку расчет не является простым и может дать неверные результаты.

Нам просто нужно использовать указанное выше смещение, чтобы найти локальную дату и время из ответа сервера, содержащего временные метки UTC.

3.2. Международный формат даты и времени

Если вам действительно нужно получить информацию о часовом поясе, то используйте объект Intl.DateTimeFormat, который доступен во всех современных браузерах.

const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;console.log(timezone); // Asia/Kolkata

4. Заключение

В этом уроке мы изучили различные варианты отображения даты и времени пользователям в соответствии с их часовым поясом и правилами смещения. Хотя Java поддерживает многочисленные способы преобразования и форматирования временных меток из одного часового пояса в другой, не существует простого способа получить часовой пояс пользователя из HTTP-запроса.

По этой причине отправка клиенту временной метки UTC является рекомендуемым подходом, при котором клиенты также могут свободно выбирать формат отображения информации.

Исходный код на Github

Прокрутить вверх