Установите часовой пояс по умолчанию для 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>
Это проблема часового пояса. Контекстный параметр должен это исправить.