Как узнать текущее время в другом часовом поясе в Java?
Вопрос
Хорошо, я чувствую себя довольно глупо, задавая такой простой вопрос, но эй.
Я пытаюсь получить текущее время в другом часовом поясе в веб-приложении Java. Я попробовал следующее очевидное решение: в моем сервлете,
Календарь localCalendar = Calendar.getInstance (myBean.getTimeZone ());
затем я передаю объект календаря в JSP в качестве атрибута запроса 'localCalendar':
It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}
но мой вывод, кажется, игнорирует установленный часовой пояс, т.е.
Сейчас: [Чт, 26 ноября 10:01:03 GMT 2009] в TimeZone Indian / Mahe
Полагаю, это связано с настройками языкового стандарта. Можно ли просто отформатировать время для моего языкового стандарта в другом часовом поясе?
Решение
Внутренние данные Calendar
в основном:
Момент времени может быть представлен значением в миллисекундах, которое является смещением от Великой Эпохи, 1 января 1970 года, 00:00: 00 000 по Гринвичу (григорианский).
Таким образом, он содержит long
, который будет одинаковым независимо от того, какие операции вы над ним выполняете, а toString
не дает никаких обещаний.
Вы хотите отформатировать дату в соответствии с локалью и часовым поясом. Вы можете сделать это на уровне представления (JSP), используя такие вещи, как JSTL или вы можете отформатировать дату в своем компоненте с помощью DateFormat и вернуть значение в виде строки.
Другие советы
Если вы хотите отобразить дату в указанном формате / часовом поясе, используйте SimpleDateFormat
ответ Макдауэлла правильный, но java.util.Calendar
(и java.util.Date
) классы устарели. Р>
java.time
Среда java.time встроена в Java 8 и более поздние версии и перенесена на Java 6 & amp; 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 & # 233; b & # 233; cois , получающий доступ к вашей странице во время работы в Индии . Поэтому используйте часовой пояс Азия / Калькутта
с Locale.CANADA_FRENCH
. р>
Для создания отформатированной строки используйте DateTimeFormatter
. Многие примеры уже существуют в переполнении стека. Укажите нужный / ожидаемый языковой стандарт
через withLocale
.