F: convertDateTime отображает неправильную дату
В моем веб-приложении я извлекаю данные с помощью Hibernate и отображаю их в файле данных RichFaces.
В моей таблице MySQL есть поле типа "дата". Когда я печатаю это поле в журнале в моем Bean, он показывает правильную дату из базы данных (например, 2010-04-21). Но в rich: dataTable это выглядит следующим образом:
4/20/10
Итак, существует расхождение в 1 день!
Я добавил конвертер "f: convertDateTime" и установил атрибут "type" в "both", чтобы отобразить время. Итак, теперь он показывает:
4/20/10 10:00:00 PM
Код для "f: convertDateTime", который я использовал:
<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>
Итак, похоже: f: convertDateTime мечтает некоторое время, потому что в поле MySQL-таблицы нет информации о времени!
Что я делаю неправильно? Что мне нужно сделать, чтобы отобразить правильную дату?
Спасибо Том
Ответы
Ответ 1
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>
.
Ответ 2
В соответствии со спецификациями JSF f: convertDateTime по умолчанию используется в часовом поясе UTC (независимо от настроек часового пояса VM), который отличается от вашего часового пояса на -1 час (стандартное время) или -2 часа (летнее время).
Мы используем страницу с областью приложения bean с свойством timeZone следующим образом:
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
Затем мы используем свойство в выражении EL:
<ice:outputText value="#{deliveryDate}">
<f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>
Преимущество заключается в том, что он автоматически рассматривает стандартное/летнее время.
Ответ 3
Вероятно, у вас проблемы с часовыми поясами.
Проверьте эту статью о том, как их разрешить.
До этого вы можете попробовать явно установить атрибут timeZone
<f:convertDataTime>
Ответ 4
У нас была та же проблема, и в итоге мы создали новый JSF-конвертер, который использует SimpleDateFormat, созданный с помощью new SimpleDateFormat(String pattern)
для преобразования даты.
Ответ 5
<h:outputText id="dateId" value="#{item.date}">
<f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/> </h:outputText>