2014-01-02 7 views
0

У меня есть пользователи, которые устанавливают свой часовой пояс при создании своей учетной записи. Срок действия учетной записи может истекать через несколько дней, и пользователь может выполнить поиск аккаунтов, срок действия которых истекает через X день. Когда поиск выполняется, он использует часовой пояс браузера, а не часовой пояс пользователей. Я установил часовой пояс следующим образом:Настройка часового пояса сервера для добавления/вычитания времени с даты

CountryDAO countryDao = new CountryDAO(); 
String timezone = countryDao.findTimezone(advisor.getPlannerID()); 
TimeZone.setDefault(TimeZone.getTimeZone(timezone)); 
DateFormat sdf = new SimpleDateFormat(); 
sdf.setTimeZone(TimeZone.getDefault()); 

Этот код не устанавливает часовой пояс для сервера. Я использую datapicker для выбора даты и поиска, но он по-прежнему использует GMT, а не часовой пояс, который установлен.

Как использовать часовой пояс, который установлен?

ответ

0

TimeZone.setDefault(...) статически устанавливает часовой пояс JVM (здесь, на сервере) для всех пользователей. Предполагаю, что вы хотите установить часовой пояс текущего сеанса пользователя. Если это так, то вам нужен специальный атрибут сеанса jsp, в котором вы храните и читаете предпочтение часового пояса пользователя.

0

Как correct answer by Meno Hochschild, java.util.TimeZone.setDefault() - это статический метод, влияющий на всю вашу JVM. Не то, что вы хотите.

Избегайте использования java.util.Date & Календарные классы. Они плохо разработаны и реализованы.

Вместо этого используйте библиотеку Joda-Time, чтобы манипулировать вашими датами. Почти все Joda-Time являются неизменными и потокобезопасными. Так что это полезно для сервлетов & JSP.

Обычно вы хотите работать в UTC/GMT, что означает отсутствие смещения часового пояса. При представлении пользователю, затем локализуйтесь в определенный часовой пояс, формат и язык.

Я не знаю, как вы это делаете, но кажется, что вы определяете часовой пояс пользователя. Хорошо. (a) Убедитесь, что ваша строка часового пояса - name of a time zone, а не устаревший 3-буквенный код. Эти трехбуквенные коды не являются ни стандартизированными, ни уникальными. (b) Если вы используете какой-то JavaScript или другой трюк для обнаружения и отправки системных параметров на клиентской машине, подумайте о том, чтобы предложить пользователю способ выбора часового пояса. Пользователь может «думать» в одном часовом поясе, пока их машина настроена на другую.

Используйте эту строку названия часового пояса, чтобы создать дату DateTimeZone в Joda-Time. Передайте это времяZone в качестве аргумента для различных методов Joda-Time.

DateTimeZone timeZone = DateTimeZone.forId(timeZoneName); 

В Joda-время, DateTime знает свой собственный часовой пояс (в отличие от java.util.Date). Если вы не укажете часовой пояс, вы получите часовой пояс JVM по умолчанию. Большой совет: всегда указывайте часовой пояс, а не полагайтесь на значение по умолчанию, чтобы избежать неожиданностей при работе в процессе производства.

DateTime dateTimeInUTC = new DateTime(DateTimeZone.UTC); 
DateTime dateTimeInParis = dateTimeInUTC.toDateTime(DateTimeZone.forId("Europe/Paris")); 

В Joda-Time вы можете добавлять и вычитать годы, месяцы, дни, часы и т. Д. И методы сравнения проверяют, датируются ли даты или после друг друга. Чтобы найти начало дня, звоните withTimeAtStartOfDay (не просто установите часы на ноль, так как не все дни во всех зонах начинаются в полночь).

DateTime aWeekAgoDateTime = new DateTime(timeZone).withTimeAtStartOfDay().minusWeeks(1).withTimeAtStartOfDay(); 
… 
boolean isMoreThanWeekOld = someDateTime.isBefore(aWeekAgoDateTime); 

Помимо этого, я больше не могу помочь. Ваш вопрос непонятен. Какой поиск? База данных? Массив или другая коллекция? В JavaScript на клиенте? В Java на сервере?

Смежные вопросы