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>