f:convertDateTime отображает неверную дату
В моем веб-приложении я получаю данные, используя Hibernate, и отображаю их в таблице данных RichFaces.
В моей MySQL-таблице есть поле типа "дата". Когда я печатаю это поле в журнале моего Бина, в нем отображается правильная дата из базы данных (например, 2010-04-21). Но в rich: dataTable это выглядит так:
4/20/10
Итак, расхождение в 1 день!
Я добавил конвертер "f:convertDateTime" и установил для атрибута "тип" значение "оба", чтобы также отображать время. Так что теперь это показывает:
20.04.10 22:00:00
Код для "f:convertDateTime", который я использовал:
<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>
Похоже, что f: convertDateTime некоторое время придумывает, потому что в поле MySQL-таблицы нет информации о времени!
Что я делаю неправильно? Что мне нужно сделать, чтобы отобразить правильную дату?
Спасибо том
5 ответов
JSF по умолчанию использует часовой пояс UTC для преобразователей даты / времени. Чтобы переопределить это, вам нужно установить timeZone
атрибут в каждом конвертере даты / времени. Вот пример использования часового пояса EDT (при условии, что вы находитесь на востоке США).
<f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" />
locale
Атрибут управляет только полным форматированием имени дня / месяца (оно становится английским).
Если вы хотите переопределить часовой пояс UTC по умолчанию на часовой пояс по умолчанию для операционной платформы, то вам нужно добавить следующий контекстный параметр в web.xml
:
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
Тогда вам не нужно редактировать каждый отдельный JSF <f:convertXxx>
тег.
В соответствии со спецификациями JSF f:convertDateTime по умолчанию использует часовой пояс UTC (независимо от настроек часового пояса виртуальной машины), который отличается от вашего часового пояса на -1 час (стандартное время) или -2 часа (летнее время).
Мы используем бин страницы в области приложения со свойством timeZone:
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
Затем мы используем свойство в выражении EL:
<ice:outputText value="#{deliveryDate}">
<f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>
Преимущество в том, что он учитывает стандартное / летнее время автоматически.
Возможно, у вас проблемы с часовыми поясами.
Проверьте эту статью о том, как их решить.
Перед этим вы можете попробовать явно установить timeZone
атрибут <f:convertDataTime>
<h:outputText id="dateId" value="#{item.date}">
<f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/> </h:outputText>
У нас была та же проблема, и в итоге мы написали новый конвертер JSF, который использует SimpleDateFormat, созданный с new SimpleDateFormat(String pattern)
для преобразования даты.