Как узнать текущее время в другом часовом поясе в Java?

StackOverflow https://stackoverflow.com/questions/1802758

Вопрос

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

Я пытаюсь получить текущее время в другом часовом поясе в веб-приложении 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top