Ответ 1
Короткий ответ: вы не можете.
Длинный ответ: нет такой вещи, как "правильный часовой пояс для локали". Это только потому, что есть несколько стран, которые имеют более одного часового пояса (например, Соединенные Штаты). Часовой пояс - это другое понятие.
В любом случае, вы хотите решить свою проблему. Я предполагаю, что вы пишете веб-приложение, и вы видите, что часовой пояс возвращается к серверу по умолчанию. Это типичная ситуация. Оба Locale.getDefault()
и TimeZone.getDefault()
возвращают информацию, связанную с сервером. JVM не имеет возможности узнать "правильный" часовой пояс. Итак, что вы можете с этим сделать?
- Вы можете добавить информацию о часовом поясе в профиль пользователя (если у вас есть) или создать поле со списком часовых поясов (чтобы пользователь мог переключиться во время выполнения). Затем вы можете назначить соответствующий объект экземпляру
DateFormat
, и он автоматически преобразует часовой пояс. - Вы можете прочитать смещение часового пояса текущего от клиента с помощью функции JavaScript Date Object getTimezoneOffset() и как-то (AJAX) отправить его на сервер. Проблема с этим методом заключается в том, что существует несколько часовых поясов с этим смещением, и выбранный часовой пояс может быть неприемлем для других дат. Конечно, вы можете угадать часовой пояс, опросив данные по дате изменения времени, но это, вероятно, не то, что вы хотите сделать.
- Вы можете отправить неформатированное время клиенту (например, записанное как формат даты ISO 8601 или как Unix time of the epoch в отношении UTC) и Globalize или Dojo формат даты и времени для вас.
Из этих трех возможных вариантов я всегда выбираю номер 1. Предоставляя информацию о часовом поясе в профиль пользователя, вы точно знаете, какой он/ее предпочтительный часовой пояс, независимо от их текущего веб-браузера и т.д. Пожалуйста, продолжайте что некоторые пользователи могут захотеть использовать ваше приложение во время посещения других стран...