Установите часовой пояс по умолчанию для f:convertDateTime

Я использую JSF1.2, и у меня есть небольшая проблема с часовыми поясами.

Календарь учитывает мой часовой пояс и сохраняет правильное время в базе данных. Когда я показываю его, используя a h:outputtext с a f:convertDateTime, он показывает неправильную дату (я думаю, с часовым поясом по умолчанию).

Я могу сделать что-то вроде:

<h:outputText value="#{atividade.atividade.dataCriacao.time}">
  <f:convertDateTime pattern="#{msg.formatoDataCalendario2}" timeZone="America/Sao_Paulo" />
</h:outputText>

formatoDataCalendario2 = дд / мм / гггг, ЧЧ: мм в messages.properties.

Я могу также указать часовой пояс в сообщениях, но я считаю, что он имеет некоторую конфигурацию, которую я мог бы использовать.

3 ответа

Решение

Преобразователи даты / времени JSF по умолчанию задаются в часовом поясе UTC. Если вы хотите использовать другой часовой пояс, то вам действительно нужно указать его в конвертере самостоятельно. Или, если у вас есть 100% контроль над производственной средой выполнения, тогда, начиная с JSF 2.0, вы можете установить системный часовой пояс на нужный часовой пояс и добавить следующий параметр контекста в web.xml:

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

Таким образом, JSF будет использовать часовой пояс системы, полученный TimeZone#getDefault() как часовой пояс по умолчанию для конвертера.

Обратите внимание, что java.util.Date Объект сам по себе также не хранит никакой информации о часовом поясе. По умолчанию всегда используется часовой пояс UTC. Имейте это в виду при обработке представленных даты / времени.

Смотрите также:

У меня был такой сценарий. В моем приложении JSF я использовал, как указал @BalusC:

      <context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

, и у меня было в xhtml:

      <f:convertDateTime pattern="dd MMM yyyy - HH:mm:ss" type="date" />

Однако, когда я получаю дату/время, например 2020-02-18T10:15:20, Это будет преобразовано во время по Гринвичу (- 8 часов для меня в зоне PST). Таким образом, это в конечном итоге будет 2020-02-18T02:15:20. Это связано с тем, что convertDateTime по умолчанию обрабатывает дату/время без смещения часового пояса как время по Гринвичу, поэтому оно преобразует его в время по Гринвичу.

Как только я начал получать смещение, как 2020-02-18T10:15:20-07:00, мои дата/время больше не будут преобразовываться в GMT, так как они будут распознавать, что смещение соответствует смещению зоны PST, и поэтому не будут преобразовываться в GMT.

Надеюсь, это немного поможет.

Для корректного отображения даты вам нужно изменить только в вашем файле web.xml

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

и в вашем файле xhtml

<h:outputText value="#{report.date}">
    <f:convertDateTime pattern="dd-MMM-yyyy" />
</h:outputText>

Это проблема часового пояса. Контекстный параметр должен это исправить.

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