2016-07-05 2 views
0

У меня есть данные в БД в UTC часовом поясе и некоторая логика на клиенте, которая зависит от конкретного времени.установить часовой пояс за запрос весной

Существовало решение вернуть данные с сервера в часовом поясе пользователя, так что есть поток:

  1. сторона клиента определяет часовой пояс пользователя с помощью Javascript
  2. отправляет его в пользовательском заголовке (т.е. "X-TIMEZONE")
  3. сервер перехватывает запрос (в Filter) и устанавливает текущую временную зону для него (за заказ)
  4. сервера обрабатывает конверсии и возвращают данные для пользователей в его часовом поясе

Таким образом, проблема в заданном часовом поясе с запросом, возможно ли это?

Я узнал, что Timezone.setDefault() устанавливает часовой пояс для применения в целом.

Спасибо.

+0

Храните часовой пояс в Spring Spring и используйте его при необходимости (при работе с датами и временем). Невозможно установить часовую зону с запросом в JVM, поскольку сама JVM ничего не знает о областях. – Jesper

+0

В Java8 есть класс ZonedDateTime.Вы можете передать зону dao и создать в ней время с зоной. – Damian0o

+0

На самом деле 'TimeZone.setDefault' влияет на все потоки * всех приложений *, запущенных в этой JVM. Сделайте это только в крайнем случае. Вместо этого передайте объект, представляющий желаемый часовой пояс, и используйте его в необязательных аргументах часового пояса. –

ответ

1

надеюсь, что я правильно понял ваш вопрос. Я столкнулся с подобным вопросом пару недель назад, и это было моим решением. Мой код размещался там, где время было UTC, поэтому, если ваш код не размещен там, вы можете сделать это Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));, чтобы сделать это UTC. Переменная часовая зона, в которой я прохожу, - это только целевой часовой пояс, который я хотел. Это в основном добавляет или вычитает миллисекунды для преобразования времени в соответствии с требуемым часовым поясом. Календарный объект времени должен быть временем, которое вы ищете.

Calendar time = Calendar.getInstance(); 
time.setTime(date); 
TimeZone localTimeZone = TimeZone.getTimeZone(timezone); 
int offSet = localTimeZone.getOffset(date.getTime()); 
time.set(Calendar.MILLISECOND, time.get(Calendar.MILLISECOND) + offSet); 

По этой ссылке вы можете найти список допустимых параметров часового пояса. http://tutorials.jenkov.com/java-date-time/java-util-timezone.html

+0

Это плохой подход. Вы не должны рассчитывать корректировку для компенсации самостоятельно. Пусть классы даты и времени выполняют фактические вычисления и корректировки. Aldo, вы используете старые неприятные классы, которые были вытеснены java.time. –

0

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

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

Сложные старые классы времени, связанные с самыми ранними версиями Java, были вытеснены классами java.time, встроенными в Java 8 и более поздние версии. Большая часть функциональных возможностей была перенесена на Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP.

Получить текущий момент в UTC.

Instant instant = Instant.now(); 

Применить часовой пояс, чтобы получить ZonedDateTime.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 

Чтобы создать строку, которая представляет это значение, вызовите toString или использовать DateTimeFormatter. В Search Stack Overflow появилось много примеров.