2010-11-04 5 views
3

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

Вот мой тест, у меня есть дата в формате 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). 

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

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

ответ

11

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

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

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

+0

Ну, мы сохраняем даты в базе данных в UTC, но я показываю время, например, время запроса, запрошенное по местному времени. Итак, мне нужны оба. По этой причине я не могу запустить сервер с часовым поясом UTC. То, что я ищу, - это переход от времени UTC к указанному часовому поясу. Я не хочу менять время сервера для этого. У сервера есть другие веб-приложения, которые являются локальными, поэтому я не могу поменять часовой пояс сервера на UTC. –

+0

Здесь есть 'fmt: setTimeZone' и/или' fmt: formatDate timeZone'. 'Date' сам всегда UTC. – BalusC

+0

ну, допустим, у вас есть время UTC из базы данных, и вы хотите отформатировать его и показать в UTC время, как бы вы показали его в своем JSP? Предполагая, что сервер работает в другом часовом поясе, чем UTC. –

2

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

+0

Итак, как я могу сказать Java время, которое я передаю fmt: formatDate является временем UTC, а не локальным? –

2

Try:

<fmt:setTimeZone value="Europe/London" scope="session"/> 
+1

Он уже делает это более коротко. – BalusC

0
<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

2

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

Поместите этот параметр в качестве аргумента на сервере, чтобы настроить использование времени UTC, в этом случае для кота:

-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 
+0

Вот что я сказал в P.S. в моем вопросе - я не мог изменить свой часовой пояс сервера, поэтому мне нужно было создать новую дату с часовым поясом UTC. –

+0

Для преобразования времени UTC использовать эту функцию: общественности Дата getDateFromStringUTC (String Fecha, локали) { \t SimpleDateFormat SimpleDateFormat = новый SimpleDateFormat (SkremmConstants.FORMAT_DATE, локали); \t TimeZone utcZone = TimeZone.getTimeZone ("UTC"); \t simpleDateFormat.setTimeZone (utcZone); \t Дата дата = null; \t try { \t date = simpleDateFormat.parse (fecha); \t} catch (ParseException e) { \t e.printStackTrace(); \t} \t дата возвращения; } – borchvm

+0

Я положил его на функцию – borchvm

2

Для преобразования времени 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; 
    } 
Смежные вопросы