Как узнать текущее время в другом часовом поясе в Java? - PullRequest
1 голос
/ 26 ноября 2009

ОК - я чувствую себя довольно глупо, задавая такой простой вопрос, но эй.

Я пытаюсь получить текущее время в другом часовом поясе в веб-приложении Java. Я попробовал следующее очевидное решение: в моем сервлете,

Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());

затем я передаю объект календаря в JSP в качестве атрибута запроса 'localCalendar':

It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}

но мой вывод, кажется, игнорирует установленный часовой пояс, т.е.

It is now: [Thu Nov 26 10:01:03 GMT 2009] in TimeZone Indian/Mahe

Полагаю, это как-то связано с настройками локали. Можно ли просто отформатировать время для моей локали в другом часовом поясе?

Ответы [ 3 ]

6 голосов
/ 26 ноября 2009

Внутренние данные Calendar в основном:

Момент времени может быть представлен значением в миллисекундах, которое является смещением от Эпохи, 1 января 1970 г., 00:00: 00 000 по Гринвичу (григорианский).

Таким образом, он содержит long, который будет одинаковым независимо от того, какие операции вы над ним выполняете, а toString не дает никаких обещаний.

Вы хотите отформатировать дату в соответствии с локалью и часовым поясом. Вы можете сделать это на уровне представления (JSP), используя такие вещи, как JSTL , или вы можете отформатировать дату в вашем бине, используя DateFormat и вернуть значение в виде строки.

3 голосов
/ 26 ноября 2009

Если вы хотите отобразить дату в заданном формате / часовом поясе, используйте SimpleDateFormat

0 голосов
/ 11 апреля 2016

Ответ МакДауэлла правильный, но классы java.util.Calendarjava.util.Date) устарели.

java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии и обратно портирована на Java 6 и 7 и на Android. Эти новые классы вытесняют старые классы даты и времени, поскольку они доказали, что они плохо спроектированы, сбивают с толку и создают проблемы.

Instant - текущий момент в UTC.

Instant now = Instant.now();

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

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

часовой пояс против локали

Обратите внимание, что часовой пояс и Locale являются ортогональными проблемами. Часовой пояс влияет на настенные часы , смещение от UTC . Locale влияет только на презентацию. Локаль используется для (а) человеческого языка в качестве названия дня и месяца и (б) культурных норм, касающихся таких вопросов, как месяц до дня месяца, запятая или период и т. Д.

Например, у вас может быть пользователь, читающий по-французски Québécois , имеющий доступ к вашей странице во время работы в India . Поэтому используйте часовой пояс Asia/Kolkata с Locale.CANADA_FRENCH.

Для генерации форматированной строки используйте класс DateTimeFormatter. Многие примеры уже существуют в переполнении стека. Укажите желаемый / ожидаемый Locale с помощью withLocale метода.

...