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) для преобразования даты.

Другие вопросы по тегам