JSTL и часовые пояса - PullRequest
       15

JSTL и часовые пояса

3 голосов
/ 05 ноября 2010

У меня есть несколько вопросов относительно часовых поясов. Мы храним всю нашу дату в формате UTC, но нам нужно показать некоторые из них по местному (восточному США) времени и по UTC одновременно.

Вот мой тест, у меня есть дата в UTC и я хочу показать ее в UTC и местном времени:

<html>
<!-- let's assume this date is in UTC, I get it from Database in my code -->
<jsp:useBean id="dateValue" class="java.util.Date" />

GMT
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="GMT"/>
</html>
<!-- Displays the original time +4  - not what I need-->

No time zone
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z"/> 
<!-- Displays the original time, but timezone is EDT -->

US/Eastern
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="US/Eastern"/> 
<!-- Displays the original time, timezone is EDT, I need original + 4 -->

</html>

Для повторения: У меня есть время UTC из базы данных, и я хочу отформатировать его и показать в часовом поясе UTC. Сервер работает в другом часовом поясе, кроме UTC.

Мне нужна такая функция, как

convertToTimezone(date, originalTimeZone, desiredTimeZone). 

То, что предоставляет fmt: formatDate, похоже на

convertToTimezone(date, serverTimeZone, desiredTimeZone). 

Я мог бы взломать его, но это обычно вызывает проблемы при переходе на летнее время и т. Д.

P.S. Для тех, кто ищет ответы, нужно запустить ваш сервер в формате UTC, тогда преобразования будут работать нормально. Если это невозможно изменить, единственный способ - создать новую дату с часовым поясом UTC, сделать это в явном виде, я сам преобразовал время, которое мне пришлось отправлять в текст, затем создал новую дату и предоставил данные из текста и Часовой пояс UTC Если вы этого не сделаете, часовой пояс считывается с сервера.

Ответы [ 6 ]

12 голосов
/ 05 ноября 2010

Я не понимаю твою проблему.Все работает правильно.Вы, похоже, ожидаете, что new Date() будет относиться к времени компьютера как к Гринвичу, то есть к 19:21 по Гринвичу.Это не верно.Он рассчитывает реальное время по Гринвичу на основе часового пояса компьютера.fmt:setTimeZone не меняет часовой пояс компьютера, а также не влияет на new Date().fmt:setTimeZone просто устанавливает часовой пояс по умолчанию для всех дат, которые должны быть отформатированы как fmt:formatDate.Это обязательно, только если часовой пояс компьютера не GMT.

Удалите fmt:setTimeZone, и вы увидите, что даты (неправильно) смещены на 4 часа.Затем запустите сервер с -Duser.timezone=UTC (чтобы переопределить часовой пояс компьютера по умолчанию), и вы увидите, что он снова верен.Также попробуйте с реальными датами из БД вместо new Date().

Независимо от того, работа сервера в часовом поясе, отличном от UTC, является плохой практикой.Это приведет только к неприятностям во всех цветах.Я настоятельно рекомендую запустить сервер в UTC.Если по какой-то причине вы не хотите изменять часовой пояс компьютера, это можно сделать, добавив -Duser.timezone=UTC к аргументам виртуальной машины сервера.Используйте UTC все время и применяйте часовой пояс только в тот момент, когда отображает его для конечного пользователя.См. Также Рекомендации по летнему времени и часовым поясам .

2 голосов
/ 12 мая 2014

Для преобразования времени UTC я использую эту функцию:

 public Date getUTCDateFromString(String fecha, Locale yourLocale) {
    SimpleDateFormat simpleDateFormat = new 
    SimpleDateFormat("yyyy-MM-dd HH:mm:ss", yourLocale);
    TimeZone utcZone = TimeZone.getTimeZone("UTC");
    simpleDateFormat.setTimeZone(utcZone);
    Date date = null;
    try {
        date = simpleDateFormat.parse(fecha);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
    }
2 голосов
/ 08 мая 2014

Вам необходимо использовать международное время (UTC / Zulu), чтобы добавить следующий график использования времени клиента, например, «GMT + 1». Смотрите этот пример.

Поместите этот параметр в качестве аргумента на вашем сервере для установки времени UTC, в данном случае для tomcat:

-Duser.timezone = "UTC"

/* Java */      

@RequestMapping(value = "/web", method = { RequestMethod.POST, RequestMethod.GET })
public String web(Model model, HttpSession session, Locale locale) {

    Date today = new Date();
    model.addAttribute("currentTime", today);
    model.addAttribute("timezone", "GMT+1");

    return "web";
}

Чтобы показать дату, выберите нужный вам шаблон (свойства)

/* JSP web */

<fmt:timeZone value="${timezone}">
<spring:message code="date_format_dateMin" var="pattern"/>
<fmt:formatDate value="${currentTime}" timeZone="${timezone}" pattern="${pattern}" var="searchFormated" />
<span class="innerLabel">${searchFormated}</span>   
</fmt:timeZone>

/* Properties */

date_format_dateMin=yyyy/MM/dd HH:mm
date_format=yyyy/MM/dd HH:mm:ss    
date_format2=yyyy/MM/dd
date_format3_js=yy/mm/dd
date_format4_time=HH:mm
date_format4=dd/MM/yyyy HH:mm:ss
2 голосов
/ 05 ноября 2010

Попробуйте:

<fmt:setTimeZone value="Europe/London" scope="session"/>
2 голосов
/ 05 ноября 2010

Java предполагает, что ваше время - GMT + 4, потому что ваше системное время - GMT + 4.

0 голосов
/ 15 ноября 2012
<c:when test="${currentField eq 'dateline'}">
  <c:set target="${storyContent}" property="publishedDate">
  <fmt:formatDate value="${article.publishedDateAsDate}" timeZone="Asia/Dacca"       pattern="${storyContent.dateFormat}"/>
  </c:set>

Я балуюсь этой проблемой уже 3 дня.

Сначала это было так -

<fmt:formatDate value="${article.publishedDateAsDate}" pattern="${storyContent.dateFormat}"/>

, которая показала дату в серверном времени UTC + 00 часов.

Я хотел показать его во времени Дакки, оставив время сервера без изменений. Добавление этого решило проблему -

TimeZone = "Азия / Дакка"

Вы можете найти все подробности о часовом поясе Java здесь http://joda -time.sourceforge.net / timezones.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...